rational_horner3_18.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 1,309 行 · 第 1/3 页
HPP
1,309 行
V z2 = 1 / (x * x); V t[4]; t[0] = a[0] * z2 + a[2]; t[1] = a[1] * z2 + a[3]; t[2] = b[0] * z2 + b[2]; t[3] = b[1] * z2 + b[3]; t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[4]); t[1] += static_cast<V>(a[5]); t[2] += static_cast<V>(b[4]); t[3] += static_cast<V>(b[5]); t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[6]); t[1] += static_cast<V>(a[7]); t[2] += static_cast<V>(b[6]); t[3] += static_cast<V>(b[7]); t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[8]); t[1] += static_cast<V>(a[9]); t[2] += static_cast<V>(b[8]); t[3] += static_cast<V>(b[9]); t[0] *= z2; t[2] *= z2; t[0] += static_cast<V>(a[10]); t[2] += static_cast<V>(b[10]); t[1] *= z; t[3] *= z; return (t[0] + t[1]) / (t[2] + t[3]); }}template <class T, class U, class V>inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*){ if(x <= 1) { V x2 = x * x; V t[4]; t[0] = a[11] * x2 + a[9]; t[1] = a[10] * x2 + a[8]; t[2] = b[11] * x2 + b[9]; t[3] = b[10] * x2 + b[8]; t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[7]); t[1] += static_cast<V>(a[6]); t[2] += static_cast<V>(b[7]); t[3] += static_cast<V>(b[6]); t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[5]); t[1] += static_cast<V>(a[4]); t[2] += static_cast<V>(b[5]); t[3] += static_cast<V>(b[4]); t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[3]); t[1] += static_cast<V>(a[2]); t[2] += static_cast<V>(b[3]); t[3] += static_cast<V>(b[2]); t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[1]); t[1] += static_cast<V>(a[0]); t[2] += static_cast<V>(b[1]); t[3] += static_cast<V>(b[0]); t[0] *= x; t[2] *= x; return (t[0] + t[1]) / (t[2] + t[3]); } else { V z = 1 / x; V z2 = 1 / (x * x); V t[4]; t[0] = a[0] * z2 + a[2]; t[1] = a[1] * z2 + a[3]; t[2] = b[0] * z2 + b[2]; t[3] = b[1] * z2 + b[3]; t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[4]); t[1] += static_cast<V>(a[5]); t[2] += static_cast<V>(b[4]); t[3] += static_cast<V>(b[5]); t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[6]); t[1] += static_cast<V>(a[7]); t[2] += static_cast<V>(b[6]); t[3] += static_cast<V>(b[7]); t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[8]); t[1] += static_cast<V>(a[9]); t[2] += static_cast<V>(b[8]); t[3] += static_cast<V>(b[9]); t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[10]); t[1] += static_cast<V>(a[11]); t[2] += static_cast<V>(b[10]); t[3] += static_cast<V>(b[11]); t[0] *= z; t[2] *= z; return (t[0] + t[1]) / (t[2] + t[3]); }}template <class T, class U, class V>inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*){ if(x <= 1) { V x2 = x * x; V t[4]; t[0] = a[12] * x2 + a[10]; t[1] = a[11] * x2 + a[9]; t[2] = b[12] * x2 + b[10]; t[3] = b[11] * x2 + b[9]; t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[8]); t[1] += static_cast<V>(a[7]); t[2] += static_cast<V>(b[8]); t[3] += static_cast<V>(b[7]); t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[6]); t[1] += static_cast<V>(a[5]); t[2] += static_cast<V>(b[6]); t[3] += static_cast<V>(b[5]); t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[4]); t[1] += static_cast<V>(a[3]); t[2] += static_cast<V>(b[4]); t[3] += static_cast<V>(b[3]); t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[2]); t[1] += static_cast<V>(a[1]); t[2] += static_cast<V>(b[2]); t[3] += static_cast<V>(b[1]); t[0] *= x2; t[2] *= x2; t[0] += static_cast<V>(a[0]); t[2] += static_cast<V>(b[0]); t[1] *= x; t[3] *= x; return (t[0] + t[1]) / (t[2] + t[3]); } else { V z = 1 / x; V z2 = 1 / (x * x); V t[4]; t[0] = a[0] * z2 + a[2]; t[1] = a[1] * z2 + a[3]; t[2] = b[0] * z2 + b[2]; t[3] = b[1] * z2 + b[3]; t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[4]); t[1] += static_cast<V>(a[5]); t[2] += static_cast<V>(b[4]); t[3] += static_cast<V>(b[5]); t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[6]); t[1] += static_cast<V>(a[7]); t[2] += static_cast<V>(b[6]); t[3] += static_cast<V>(b[7]); t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[8]); t[1] += static_cast<V>(a[9]); t[2] += static_cast<V>(b[8]); t[3] += static_cast<V>(b[9]); t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[10]); t[1] += static_cast<V>(a[11]); t[2] += static_cast<V>(b[10]); t[3] += static_cast<V>(b[11]); t[0] *= z2; t[2] *= z2; t[0] += static_cast<V>(a[12]); t[2] += static_cast<V>(b[12]); t[1] *= z; t[3] *= z; return (t[0] + t[1]) / (t[2] + t[3]); }}template <class T, class U, class V>inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*){ if(x <= 1) { V x2 = x * x; V t[4]; t[0] = a[13] * x2 + a[11]; t[1] = a[12] * x2 + a[10]; t[2] = b[13] * x2 + b[11]; t[3] = b[12] * x2 + b[10]; t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[9]); t[1] += static_cast<V>(a[8]); t[2] += static_cast<V>(b[9]); t[3] += static_cast<V>(b[8]); t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[7]); t[1] += static_cast<V>(a[6]); t[2] += static_cast<V>(b[7]); t[3] += static_cast<V>(b[6]); t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[5]); t[1] += static_cast<V>(a[4]); t[2] += static_cast<V>(b[5]); t[3] += static_cast<V>(b[4]); t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[3]); t[1] += static_cast<V>(a[2]); t[2] += static_cast<V>(b[3]); t[3] += static_cast<V>(b[2]); t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[1]); t[1] += static_cast<V>(a[0]); t[2] += static_cast<V>(b[1]); t[3] += static_cast<V>(b[0]); t[0] *= x; t[2] *= x; return (t[0] + t[1]) / (t[2] + t[3]); } else { V z = 1 / x; V z2 = 1 / (x * x); V t[4]; t[0] = a[0] * z2 + a[2]; t[1] = a[1] * z2 + a[3]; t[2] = b[0] * z2 + b[2]; t[3] = b[1] * z2 + b[3]; t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[4]); t[1] += static_cast<V>(a[5]); t[2] += static_cast<V>(b[4]); t[3] += static_cast<V>(b[5]); t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[6]); t[1] += static_cast<V>(a[7]); t[2] += static_cast<V>(b[6]); t[3] += static_cast<V>(b[7]); t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[8]); t[1] += static_cast<V>(a[9]); t[2] += static_cast<V>(b[8]); t[3] += static_cast<V>(b[9]); t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[10]); t[1] += static_cast<V>(a[11]); t[2] += static_cast<V>(b[10]); t[3] += static_cast<V>(b[11]); t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[12]); t[1] += static_cast<V>(a[13]); t[2] += static_cast<V>(b[12]); t[3] += static_cast<V>(b[13]); t[0] *= z; t[2] *= z; return (t[0] + t[1]) / (t[2] + t[3]); }}template <class T, class U, class V>inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*){ if(x <= 1) { V x2 = x * x; V t[4]; t[0] = a[14] * x2 + a[12]; t[1] = a[13] * x2 + a[11]; t[2] = b[14] * x2 + b[12]; t[3] = b[13] * x2 + b[11]; t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[10]); t[1] += static_cast<V>(a[9]); t[2] += static_cast<V>(b[10]); t[3] += static_cast<V>(b[9]); t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[8]); t[1] += static_cast<V>(a[7]); t[2] += static_cast<V>(b[8]); t[3] += static_cast<V>(b[7]); t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[6]); t[1] += static_cast<V>(a[5]); t[2] += static_cast<V>(b[6]); t[3] += static_cast<V>(b[5]); t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[4]); t[1] += static_cast<V>(a[3]); t[2] += static_cast<V>(b[4]); t[3] += static_cast<V>(b[3]); t[0] *= x2; t[1] *= x2; t[2] *= x2; t[3] *= x2; t[0] += static_cast<V>(a[2]); t[1] += static_cast<V>(a[1]); t[2] += static_cast<V>(b[2]); t[3] += static_cast<V>(b[1]); t[0] *= x2; t[2] *= x2; t[0] += static_cast<V>(a[0]); t[2] += static_cast<V>(b[0]); t[1] *= x; t[3] *= x; return (t[0] + t[1]) / (t[2] + t[3]); } else { V z = 1 / x; V z2 = 1 / (x * x); V t[4]; t[0] = a[0] * z2 + a[2]; t[1] = a[1] * z2 + a[3]; t[2] = b[0] * z2 + b[2]; t[3] = b[1] * z2 + b[3]; t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[4]); t[1] += static_cast<V>(a[5]); t[2] += static_cast<V>(b[4]); t[3] += static_cast<V>(b[5]); t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[6]); t[1] += static_cast<V>(a[7]); t[2] += static_cast<V>(b[6]); t[3] += static_cast<V>(b[7]); t[0] *= z2; t[1] *= z2; t[2] *= z2; t[3] *= z2; t[0] += static_cast<V>(a[8]); t[1] += static_cast<V>(a[9]); t[2] += static_cast<V>(b[8]);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?