rational_horner3_11.hpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. // (C) Copyright John Maddock 2007.
  2. // Use, modification and distribution are subject to the
  3. // Boost Software License, Version 1.0. (See accompanying file
  4. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. //
  6. // This file is machine generated, do not edit by hand
  7. // Polynomial evaluation using second order Horners rule
  8. #ifndef BOOST_MATH_TOOLS_RAT_EVAL_11_HPP
  9. #define BOOST_MATH_TOOLS_RAT_EVAL_11_HPP
  10. namespace boost{ namespace math{ namespace tools{ namespace detail{
  11. template <class T, class U, class V>
  12. inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
  13. {
  14. return static_cast<V>(0);
  15. }
  16. template <class T, class U, class V>
  17. inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
  18. {
  19. return static_cast<V>(a[0]) / static_cast<V>(b[0]);
  20. }
  21. template <class T, class U, class V>
  22. inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
  23. {
  24. return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
  25. }
  26. template <class T, class U, class V>
  27. inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
  28. {
  29. return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
  30. }
  31. template <class T, class U, class V>
  32. inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
  33. {
  34. return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
  35. }
  36. template <class T, class U, class V>
  37. inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
  38. {
  39. if(x <= 1)
  40. {
  41. V x2 = x * x;
  42. V t[4];
  43. t[0] = a[4] * x2 + a[2];
  44. t[1] = a[3] * x2 + a[1];
  45. t[2] = b[4] * x2 + b[2];
  46. t[3] = b[3] * x2 + b[1];
  47. t[0] *= x2;
  48. t[2] *= x2;
  49. t[0] += static_cast<V>(a[0]);
  50. t[2] += static_cast<V>(b[0]);
  51. t[1] *= x;
  52. t[3] *= x;
  53. return (t[0] + t[1]) / (t[2] + t[3]);
  54. }
  55. else
  56. {
  57. V z = 1 / x;
  58. V z2 = 1 / (x * x);
  59. V t[4];
  60. t[0] = a[0] * z2 + a[2];
  61. t[1] = a[1] * z2 + a[3];
  62. t[2] = b[0] * z2 + b[2];
  63. t[3] = b[1] * z2 + b[3];
  64. t[0] *= z2;
  65. t[2] *= z2;
  66. t[0] += static_cast<V>(a[4]);
  67. t[2] += static_cast<V>(b[4]);
  68. t[1] *= z;
  69. t[3] *= z;
  70. return (t[0] + t[1]) / (t[2] + t[3]);
  71. }
  72. }
  73. template <class T, class U, class V>
  74. inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
  75. {
  76. if(x <= 1)
  77. {
  78. V x2 = x * x;
  79. V t[4];
  80. t[0] = a[5] * x2 + a[3];
  81. t[1] = a[4] * x2 + a[2];
  82. t[2] = b[5] * x2 + b[3];
  83. t[3] = b[4] * x2 + b[2];
  84. t[0] *= x2;
  85. t[1] *= x2;
  86. t[2] *= x2;
  87. t[3] *= x2;
  88. t[0] += static_cast<V>(a[1]);
  89. t[1] += static_cast<V>(a[0]);
  90. t[2] += static_cast<V>(b[1]);
  91. t[3] += static_cast<V>(b[0]);
  92. t[0] *= x;
  93. t[2] *= x;
  94. return (t[0] + t[1]) / (t[2] + t[3]);
  95. }
  96. else
  97. {
  98. V z = 1 / x;
  99. V z2 = 1 / (x * x);
  100. V t[4];
  101. t[0] = a[0] * z2 + a[2];
  102. t[1] = a[1] * z2 + a[3];
  103. t[2] = b[0] * z2 + b[2];
  104. t[3] = b[1] * z2 + b[3];
  105. t[0] *= z2;
  106. t[1] *= z2;
  107. t[2] *= z2;
  108. t[3] *= z2;
  109. t[0] += static_cast<V>(a[4]);
  110. t[1] += static_cast<V>(a[5]);
  111. t[2] += static_cast<V>(b[4]);
  112. t[3] += static_cast<V>(b[5]);
  113. t[0] *= z;
  114. t[2] *= z;
  115. return (t[0] + t[1]) / (t[2] + t[3]);
  116. }
  117. }
  118. template <class T, class U, class V>
  119. inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
  120. {
  121. if(x <= 1)
  122. {
  123. V x2 = x * x;
  124. V t[4];
  125. t[0] = a[6] * x2 + a[4];
  126. t[1] = a[5] * x2 + a[3];
  127. t[2] = b[6] * x2 + b[4];
  128. t[3] = b[5] * x2 + b[3];
  129. t[0] *= x2;
  130. t[1] *= x2;
  131. t[2] *= x2;
  132. t[3] *= x2;
  133. t[0] += static_cast<V>(a[2]);
  134. t[1] += static_cast<V>(a[1]);
  135. t[2] += static_cast<V>(b[2]);
  136. t[3] += static_cast<V>(b[1]);
  137. t[0] *= x2;
  138. t[2] *= x2;
  139. t[0] += static_cast<V>(a[0]);
  140. t[2] += static_cast<V>(b[0]);
  141. t[1] *= x;
  142. t[3] *= x;
  143. return (t[0] + t[1]) / (t[2] + t[3]);
  144. }
  145. else
  146. {
  147. V z = 1 / x;
  148. V z2 = 1 / (x * x);
  149. V t[4];
  150. t[0] = a[0] * z2 + a[2];
  151. t[1] = a[1] * z2 + a[3];
  152. t[2] = b[0] * z2 + b[2];
  153. t[3] = b[1] * z2 + b[3];
  154. t[0] *= z2;
  155. t[1] *= z2;
  156. t[2] *= z2;
  157. t[3] *= z2;
  158. t[0] += static_cast<V>(a[4]);
  159. t[1] += static_cast<V>(a[5]);
  160. t[2] += static_cast<V>(b[4]);
  161. t[3] += static_cast<V>(b[5]);
  162. t[0] *= z2;
  163. t[2] *= z2;
  164. t[0] += static_cast<V>(a[6]);
  165. t[2] += static_cast<V>(b[6]);
  166. t[1] *= z;
  167. t[3] *= z;
  168. return (t[0] + t[1]) / (t[2] + t[3]);
  169. }
  170. }
  171. template <class T, class U, class V>
  172. inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
  173. {
  174. if(x <= 1)
  175. {
  176. V x2 = x * x;
  177. V t[4];
  178. t[0] = a[7] * x2 + a[5];
  179. t[1] = a[6] * x2 + a[4];
  180. t[2] = b[7] * x2 + b[5];
  181. t[3] = b[6] * x2 + b[4];
  182. t[0] *= x2;
  183. t[1] *= x2;
  184. t[2] *= x2;
  185. t[3] *= x2;
  186. t[0] += static_cast<V>(a[3]);
  187. t[1] += static_cast<V>(a[2]);
  188. t[2] += static_cast<V>(b[3]);
  189. t[3] += static_cast<V>(b[2]);
  190. t[0] *= x2;
  191. t[1] *= x2;
  192. t[2] *= x2;
  193. t[3] *= x2;
  194. t[0] += static_cast<V>(a[1]);
  195. t[1] += static_cast<V>(a[0]);
  196. t[2] += static_cast<V>(b[1]);
  197. t[3] += static_cast<V>(b[0]);
  198. t[0] *= x;
  199. t[2] *= x;
  200. return (t[0] + t[1]) / (t[2] + t[3]);
  201. }
  202. else
  203. {
  204. V z = 1 / x;
  205. V z2 = 1 / (x * x);
  206. V t[4];
  207. t[0] = a[0] * z2 + a[2];
  208. t[1] = a[1] * z2 + a[3];
  209. t[2] = b[0] * z2 + b[2];
  210. t[3] = b[1] * z2 + b[3];
  211. t[0] *= z2;
  212. t[1] *= z2;
  213. t[2] *= z2;
  214. t[3] *= z2;
  215. t[0] += static_cast<V>(a[4]);
  216. t[1] += static_cast<V>(a[5]);
  217. t[2] += static_cast<V>(b[4]);
  218. t[3] += static_cast<V>(b[5]);
  219. t[0] *= z2;
  220. t[1] *= z2;
  221. t[2] *= z2;
  222. t[3] *= z2;
  223. t[0] += static_cast<V>(a[6]);
  224. t[1] += static_cast<V>(a[7]);
  225. t[2] += static_cast<V>(b[6]);
  226. t[3] += static_cast<V>(b[7]);
  227. t[0] *= z;
  228. t[2] *= z;
  229. return (t[0] + t[1]) / (t[2] + t[3]);
  230. }
  231. }
  232. template <class T, class U, class V>
  233. inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
  234. {
  235. if(x <= 1)
  236. {
  237. V x2 = x * x;
  238. V t[4];
  239. t[0] = a[8] * x2 + a[6];
  240. t[1] = a[7] * x2 + a[5];
  241. t[2] = b[8] * x2 + b[6];
  242. t[3] = b[7] * x2 + b[5];
  243. t[0] *= x2;
  244. t[1] *= x2;
  245. t[2] *= x2;
  246. t[3] *= x2;
  247. t[0] += static_cast<V>(a[4]);
  248. t[1] += static_cast<V>(a[3]);
  249. t[2] += static_cast<V>(b[4]);
  250. t[3] += static_cast<V>(b[3]);
  251. t[0] *= x2;
  252. t[1] *= x2;
  253. t[2] *= x2;
  254. t[3] *= x2;
  255. t[0] += static_cast<V>(a[2]);
  256. t[1] += static_cast<V>(a[1]);
  257. t[2] += static_cast<V>(b[2]);
  258. t[3] += static_cast<V>(b[1]);
  259. t[0] *= x2;
  260. t[2] *= x2;
  261. t[0] += static_cast<V>(a[0]);
  262. t[2] += static_cast<V>(b[0]);
  263. t[1] *= x;
  264. t[3] *= x;
  265. return (t[0] + t[1]) / (t[2] + t[3]);
  266. }
  267. else
  268. {
  269. V z = 1 / x;
  270. V z2 = 1 / (x * x);
  271. V t[4];
  272. t[0] = a[0] * z2 + a[2];
  273. t[1] = a[1] * z2 + a[3];
  274. t[2] = b[0] * z2 + b[2];
  275. t[3] = b[1] * z2 + b[3];
  276. t[0] *= z2;
  277. t[1] *= z2;
  278. t[2] *= z2;
  279. t[3] *= z2;
  280. t[0] += static_cast<V>(a[4]);
  281. t[1] += static_cast<V>(a[5]);
  282. t[2] += static_cast<V>(b[4]);
  283. t[3] += static_cast<V>(b[5]);
  284. t[0] *= z2;
  285. t[1] *= z2;
  286. t[2] *= z2;
  287. t[3] *= z2;
  288. t[0] += static_cast<V>(a[6]);
  289. t[1] += static_cast<V>(a[7]);
  290. t[2] += static_cast<V>(b[6]);
  291. t[3] += static_cast<V>(b[7]);
  292. t[0] *= z2;
  293. t[2] *= z2;
  294. t[0] += static_cast<V>(a[8]);
  295. t[2] += static_cast<V>(b[8]);
  296. t[1] *= z;
  297. t[3] *= z;
  298. return (t[0] + t[1]) / (t[2] + t[3]);
  299. }
  300. }
  301. template <class T, class U, class V>
  302. inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
  303. {
  304. if(x <= 1)
  305. {
  306. V x2 = x * x;
  307. V t[4];
  308. t[0] = a[9] * x2 + a[7];
  309. t[1] = a[8] * x2 + a[6];
  310. t[2] = b[9] * x2 + b[7];
  311. t[3] = b[8] * x2 + b[6];
  312. t[0] *= x2;
  313. t[1] *= x2;
  314. t[2] *= x2;
  315. t[3] *= x2;
  316. t[0] += static_cast<V>(a[5]);
  317. t[1] += static_cast<V>(a[4]);
  318. t[2] += static_cast<V>(b[5]);
  319. t[3] += static_cast<V>(b[4]);
  320. t[0] *= x2;
  321. t[1] *= x2;
  322. t[2] *= x2;
  323. t[3] *= x2;
  324. t[0] += static_cast<V>(a[3]);
  325. t[1] += static_cast<V>(a[2]);
  326. t[2] += static_cast<V>(b[3]);
  327. t[3] += static_cast<V>(b[2]);
  328. t[0] *= x2;
  329. t[1] *= x2;
  330. t[2] *= x2;
  331. t[3] *= x2;
  332. t[0] += static_cast<V>(a[1]);
  333. t[1] += static_cast<V>(a[0]);
  334. t[2] += static_cast<V>(b[1]);
  335. t[3] += static_cast<V>(b[0]);
  336. t[0] *= x;
  337. t[2] *= x;
  338. return (t[0] + t[1]) / (t[2] + t[3]);
  339. }
  340. else
  341. {
  342. V z = 1 / x;
  343. V z2 = 1 / (x * x);
  344. V t[4];
  345. t[0] = a[0] * z2 + a[2];
  346. t[1] = a[1] * z2 + a[3];
  347. t[2] = b[0] * z2 + b[2];
  348. t[3] = b[1] * z2 + b[3];
  349. t[0] *= z2;
  350. t[1] *= z2;
  351. t[2] *= z2;
  352. t[3] *= z2;
  353. t[0] += static_cast<V>(a[4]);
  354. t[1] += static_cast<V>(a[5]);
  355. t[2] += static_cast<V>(b[4]);
  356. t[3] += static_cast<V>(b[5]);
  357. t[0] *= z2;
  358. t[1] *= z2;
  359. t[2] *= z2;
  360. t[3] *= z2;
  361. t[0] += static_cast<V>(a[6]);
  362. t[1] += static_cast<V>(a[7]);
  363. t[2] += static_cast<V>(b[6]);
  364. t[3] += static_cast<V>(b[7]);
  365. t[0] *= z2;
  366. t[1] *= z2;
  367. t[2] *= z2;
  368. t[3] *= z2;
  369. t[0] += static_cast<V>(a[8]);
  370. t[1] += static_cast<V>(a[9]);
  371. t[2] += static_cast<V>(b[8]);
  372. t[3] += static_cast<V>(b[9]);
  373. t[0] *= z;
  374. t[2] *= z;
  375. return (t[0] + t[1]) / (t[2] + t[3]);
  376. }
  377. }
  378. template <class T, class U, class V>
  379. inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
  380. {
  381. if(x <= 1)
  382. {
  383. V x2 = x * x;
  384. V t[4];
  385. t[0] = a[10] * x2 + a[8];
  386. t[1] = a[9] * x2 + a[7];
  387. t[2] = b[10] * x2 + b[8];
  388. t[3] = b[9] * x2 + b[7];
  389. t[0] *= x2;
  390. t[1] *= x2;
  391. t[2] *= x2;
  392. t[3] *= x2;
  393. t[0] += static_cast<V>(a[6]);
  394. t[1] += static_cast<V>(a[5]);
  395. t[2] += static_cast<V>(b[6]);
  396. t[3] += static_cast<V>(b[5]);
  397. t[0] *= x2;
  398. t[1] *= x2;
  399. t[2] *= x2;
  400. t[3] *= x2;
  401. t[0] += static_cast<V>(a[4]);
  402. t[1] += static_cast<V>(a[3]);
  403. t[2] += static_cast<V>(b[4]);
  404. t[3] += static_cast<V>(b[3]);
  405. t[0] *= x2;
  406. t[1] *= x2;
  407. t[2] *= x2;
  408. t[3] *= x2;
  409. t[0] += static_cast<V>(a[2]);
  410. t[1] += static_cast<V>(a[1]);
  411. t[2] += static_cast<V>(b[2]);
  412. t[3] += static_cast<V>(b[1]);
  413. t[0] *= x2;
  414. t[2] *= x2;
  415. t[0] += static_cast<V>(a[0]);
  416. t[2] += static_cast<V>(b[0]);
  417. t[1] *= x;
  418. t[3] *= x;
  419. return (t[0] + t[1]) / (t[2] + t[3]);
  420. }
  421. else
  422. {
  423. V z = 1 / x;
  424. V z2 = 1 / (x * x);
  425. V t[4];
  426. t[0] = a[0] * z2 + a[2];
  427. t[1] = a[1] * z2 + a[3];
  428. t[2] = b[0] * z2 + b[2];
  429. t[3] = b[1] * z2 + b[3];
  430. t[0] *= z2;
  431. t[1] *= z2;
  432. t[2] *= z2;
  433. t[3] *= z2;
  434. t[0] += static_cast<V>(a[4]);
  435. t[1] += static_cast<V>(a[5]);
  436. t[2] += static_cast<V>(b[4]);
  437. t[3] += static_cast<V>(b[5]);
  438. t[0] *= z2;
  439. t[1] *= z2;
  440. t[2] *= z2;
  441. t[3] *= z2;
  442. t[0] += static_cast<V>(a[6]);
  443. t[1] += static_cast<V>(a[7]);
  444. t[2] += static_cast<V>(b[6]);
  445. t[3] += static_cast<V>(b[7]);
  446. t[0] *= z2;
  447. t[1] *= z2;
  448. t[2] *= z2;
  449. t[3] *= z2;
  450. t[0] += static_cast<V>(a[8]);
  451. t[1] += static_cast<V>(a[9]);
  452. t[2] += static_cast<V>(b[8]);
  453. t[3] += static_cast<V>(b[9]);
  454. t[0] *= z2;
  455. t[2] *= z2;
  456. t[0] += static_cast<V>(a[10]);
  457. t[2] += static_cast<V>(b[10]);
  458. t[1] *= z;
  459. t[3] *= z;
  460. return (t[0] + t[1]) / (t[2] + t[3]);
  461. }
  462. }
  463. }}}} // namespaces
  464. #endif // include guard