📄 a00107.html
字号:
<a name="l01098"></a>01098 <span class="keywordflow">if</span> (x == U(0)) {<a name="l01099"></a>01099 ppx = U(p[1]);<a name="l01100"></a>01100 <span class="keywordflow">return</span> U(p[0]);<a name="l01101"></a>01101 }<a name="l01102"></a>01102 <span class="keywordflow">else</span> {<a name="l01103"></a>01103 <span class="keywordtype">int</span> m = p.degree();<a name="l01104"></a>01104 U px = p[m];<a name="l01105"></a>01105 ppx = U(0);<a name="l01106"></a>01106 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = m - 1; i >= 0; --i) {<a name="l01107"></a>01107 ppx = (ppx * x) + px;<a name="l01108"></a>01108 px = (px * x) + p[i];<a name="l01109"></a>01109 <span class="comment">//ppx *= x; </span><a name="l01110"></a>01110 <span class="comment">//ppx += px;</span><a name="l01111"></a>01111 <span class="comment">//px *= x; </span><a name="l01112"></a>01112 <span class="comment">//px += p[i];</span><a name="l01113"></a>01113 }<a name="l01114"></a>01114 <span class="keywordflow">return</span> px;<a name="l01115"></a>01115 }<a name="l01116"></a>01116 }<a name="l01117"></a>01117 <span class="keywordflow">else</span> {<a name="l01118"></a>01118 ppx = U(0);<a name="l01119"></a>01119 <span class="keywordflow">return</span> p[0];<a name="l01120"></a>01120 }<a name="l01121"></a>01121 }<a name="l01122"></a>01122 <a name="l01140"></a>01140 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> U><a name="l01141"></a><a class="code" href="a00100.html#gcc297191b953d7df4ecad642e13e7911">01141</a> U <a class="code" href="a00090.html#3035df8b06fcc5015efb56762fc68f93">evalAndDerive</a>(<span class="keyword">const</span> Polynomial<T>& p, <span class="keyword">const</span> U& x, U& ppx, U& pppx) {<a name="l01142"></a>01142 <span class="keywordtype">int</span> m = p.<a class="code" href="a00090.html#b433e0edb11b32a205a9d07b89aefa8f">degree</a>();<a name="l01143"></a>01143 <span class="keywordflow">if</span> (m >= 2) {<a name="l01144"></a>01144 <span class="keywordflow">if</span> (x == U(0)) {<a name="l01145"></a>01145 ppx = U(p[1]);<a name="l01146"></a>01146 pppx = U(p[2] + p[2]);<a name="l01147"></a>01147 <span class="keywordflow">return</span> U(p[0]);<a name="l01148"></a>01148 }<a name="l01149"></a>01149 <span class="keywordflow">else</span> {<a name="l01150"></a>01150 <span class="keywordtype">int</span> m = p.<a class="code" href="a00090.html#b433e0edb11b32a205a9d07b89aefa8f">degree</a>();<a name="l01151"></a>01151 U px = p[m];<a name="l01152"></a>01152 ppx = U(0);<a name="l01153"></a>01153 pppx = U(0);<a name="l01154"></a>01154 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = m - 1; i >= 0; --i) {<a name="l01155"></a>01155 pppx *= x; <a name="l01156"></a>01156 pppx += ppx;<a name="l01157"></a>01157 ppx *= x; <a name="l01158"></a>01158 ppx += px;<a name="l01159"></a>01159 px *= x; <a name="l01160"></a>01160 px += p[i];<a name="l01161"></a>01161 }<a name="l01162"></a>01162 pppx += pppx;<a name="l01163"></a>01163 <span class="keywordflow">return</span> px;<a name="l01164"></a>01164 }<a name="l01165"></a>01165 }<a name="l01166"></a>01166 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m == 1) {<a name="l01167"></a>01167 ppx = U(p[1]);<a name="l01168"></a>01168 pppx = U(0);<a name="l01169"></a>01169 <span class="keywordflow">return</span> (p[1] * x) + p[0];<a name="l01170"></a>01170 }<a name="l01171"></a>01171 <span class="keywordflow">else</span> {<a name="l01172"></a>01172 ppx = U(0);<a name="l01173"></a>01173 pppx = U(0);<a name="l01174"></a>01174 <span class="keywordflow">return</span> p[0];<a name="l01175"></a>01175 }<a name="l01176"></a>01176 }<a name="l01177"></a>01177 <a name="l01196"></a>01196 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> U><a name="l01197"></a><a class="code" href="a00100.html#g055ddecc1576e178f623b4b8e868cc23">01197</a> U <a class="code" href="a00100.html#g055ddecc1576e178f623b4b8e868cc23">evalDeriveAndDeflate</a>(<span class="keyword">const</span> Polynomial<T>& p, <span class="keyword">const</span> U& x, U& ppx, U& pppx, Polynomial<U>& q) {<a name="l01198"></a>01198 <span class="keywordtype">int</span> m = p.<a class="code" href="a00090.html#b433e0edb11b32a205a9d07b89aefa8f">degree</a>();<a name="l01199"></a>01199 <span class="keywordflow">if</span> (m >= 2) {<a name="l01200"></a>01200 <span class="keywordflow">if</span> (x == U(0)) {<a name="l01201"></a>01201 q.resize(m);<a name="l01202"></a>01202 std::copy(&p[1], &p[m + 1], &q[0]);<a name="l01203"></a>01203 ppx = U(p[1]);<a name="l01204"></a>01204 pppx = U(p[2] + p[2]);<a name="l01205"></a>01205 <span class="keywordflow">return</span> U(p[0]);<a name="l01206"></a>01206 }<a name="l01207"></a>01207 <span class="keywordflow">else</span> {<a name="l01208"></a>01208 q.resize(m);<a name="l01209"></a>01209 U px = p[m];<a name="l01210"></a>01210 ppx = U(0);<a name="l01211"></a>01211 pppx = U(0);<a name="l01212"></a>01212 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = m - 1; i >= 0; --i) {<a name="l01213"></a>01213 pppx *= x; <a name="l01214"></a>01214 pppx += ppx;<a name="l01215"></a>01215 ppx *= x; <a name="l01216"></a>01216 ppx += px;<a name="l01217"></a>01217 q[i] = px;<a name="l01218"></a>01218 px *= x; <a name="l01219"></a>01219 px += p[i];<a name="l01220"></a>01220 }<a name="l01221"></a>01221 pppx += pppx;<a name="l01222"></a>01222 <span class="keywordflow">return</span> px;<a name="l01223"></a>01223 }<a name="l01224"></a>01224 }<a name="l01225"></a>01225 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m == 1) {<a name="l01226"></a>01226 q.resize(1);<a name="l01227"></a>01227 ppx = U(p[1]);<a name="l01228"></a>01228 pppx = U(0);<a name="l01229"></a>01229 q[0] = T(0);<a name="l01230"></a>01230 <span class="keywordflow">return</span> (p[1] * x) + p[0];<a name="l01231"></a>01231 }<a name="l01232"></a>01232 <span class="keywordflow">else</span> {<a name="l01233"></a>01233 q.resize(1);<a name="l01234"></a>01234 q[0] = U(0);<a name="l01235"></a>01235 ppx = U(0);<a name="l01236"></a>01236 pppx = U(0);<a name="l01237"></a>01237 <span class="keywordflow">return</span> p[0];<a name="l01238"></a>01238 }<a name="l01239"></a>01239 }<a name="l01240"></a>01240 <a name="l01252"></a>01252 <span class="keyword">template</span><<span class="keyword">class</span> T><a name="l01253"></a><a class="code" href="a00099.html#g13f5d5cbb65e25ebe6bfa5a1b0129f3e">01253</a> T <a class="code" href="a00099.html#g13f5d5cbb65e25ebe6bfa5a1b0129f3e">getOptimalScale</a>(<span class="keyword">const</span> Polynomial<T>& p) {<a name="l01254"></a>01254 <span class="keyword">static</span> FloatSpecs<T> fpSpecs;<a name="l01255"></a>01255 T hi = sqrt(fpSpecs.<a class="code" href="a00089.html#7fce7d8806caf8595e993e7f1258e57d">INFINY</a>);<a name="l01256"></a>01256 T lo = fpSpecs.<a class="code" href="a00089.html#ce3bf7fb1752f8ff96a483091285536d">SMALNO</a> / fpSpecs.<a class="code" href="a00089.html#5e567bf650640c58e9455ad2eb4b05bc">ETA</a>;<a name="l01257"></a>01257 T mx = 0;<a name="l01258"></a>01258 T mn = fpSpecs.<a class="code" href="a00089.html#7fce7d8806caf8595e993e7f1258e57d">INFINY</a>;<a name="l01259"></a>01259 T x;<a name="l01260"></a>01260 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 1; i < p.size(); ++i) {<a name="l01261"></a>01261 <span class="keywordflow">if</span> (p[i] > mx) mx = p[i];<a name="l01262"></a>01262 <span class="keywordflow">if</span> (p[i] != 0 && p[i] < mn) mn = p[i];<a name="l01263"></a>01263 }<a name="l01264"></a>01264 <a name="l01265"></a>01265 <span class="keywordflow">if</span> (mn >= lo && mx <= hi)<a name="l01266"></a>01266 <span class="keywordflow">return</span> T(1);<a name="l01267"></a>01267 <a name="l01268"></a>01268 x = lo / mn;<a name="l01269"></a>01269 <span class="keywordflow">if</span> (x <= T(1))<a name="l01270"></a>01270 x = 1 / (sqrt(mx) * sqrt(mn));<a name="l01271"></a>01271 <span class="keywordflow">else</span><a name="l01272"></a>01272 <span class="keywordflow">if</span> (fpSpecs.<a class="code" href="a00089.html#7fce7d8806caf8595e993e7f1258e57d">INFINY</a> / x > mx)<a name="l01273"></a>01273 x = T(1);<a name="l01274"></a>01274 <a name="l01275"></a>01275 <span class="keywordflow">return</span> pow(fpSpecs.<a class="code" href="a00089.html#e7b1a5c82772e0e055096008cb9883ef">BASE</a>, floor(T(.5) + (log(x) / fpSpecs.<a class="code" href="a00089.html#21fb6e241507492d75c488a9c65d12fe">LOG_BASE</a>)));<a name="l01276"></a>01276 }<a name="l01277"></a>01277 <a name="l01292"></a>01292 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> U><a name="l01293"></a><a class="code" href="a00099.html#g663581aef6853ed86df03a35505c9ebd">01293</a> U <a class="code" href="a00099.html#g663581aef6853ed86df03a35505c9ebd">scalePoly</a>(Polynomial<T>& p, <span class="keyword">const</span> Polynomial<U>& q) {<a name="l01294"></a>01294 U scale = <a class="code" href="a00099.html#g13f5d5cbb65e25ebe6bfa5a1b0129f3e">getOptimalScale</a>(q);<a name="l01295"></a>01295 p *= scale;<a name="l01296"></a>01296 <span class="keywordflow">return</span> scale;<a name="l01297"></a>01297 }<a name="l01298"></a>01298 <a name="l01314"></a>01314 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> U><a name="l01315"></a><a class="code" href="a00099.html#g1ca5c1a34fcdcadb083a25ecf0e1a995">01315</a> <span class="keywordtype">void</span> <a class="code" href="a00099.html#g1ca5c1a34fcdcadb083a25ecf0e1a995">modulus</a>(<span class="keyword">const</span> Polynomial<T>& p, Polynomial<U>& q) {<a name="l01316"></a>01316 <span class="keywordtype">int</span> m = p.<a class="code" href="a00090.html#b433e0edb11b32a205a9d07b89aefa8f">degree</a>();<a name="l01317"></a>01317 q.resize(m + 1);<a name="l01318"></a>01318 <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i = 0; i <= m; ++i) <a name="l01319"></a>01319 q[i] = abs(p[i]);<a name="l01320"></a>01320 }<a name="l01321"></a>01321 <a name="l01323"></a>01323 <span class="preprocessor">#endif //POLYNOMIAL_H</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Mon Aug 21 21:57:25 2006 for The Polynomials Templates Library by <a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.5 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -