18 return curr == prev ? curr :
sqrtNewtonRaphson(x,
static_cast<T
>(0.5) * (curr + x / curr), curr);
35 return x >=
static_cast<T
>(0) && x < std::numeric_limits<T>::infinity() ?
sqrtNewtonRaphson(x, x,
static_cast<T
>(0))
36 : std::numeric_limits<T>::quiet_NaN();
40 bool constexpr
eq(T x, T y)
42 return x < y ? (y - x) <= y * std::numeric_limits<T>::epsilon() : (x - y) <= x * std::numeric_limits<T>::epsilon();
50 :
cbrtNewtonRaphson(x, (
static_cast<T
>(2) * curr + x / (curr * curr)) /
static_cast<T
>(3), curr);
57 : std::numeric_limits<T>::quiet_NaN();
82 constexpr T ulp = std::numeric_limits<T>::epsilon();
83 constexpr T taylor_2_bound =
sqrt(
static_cast<T
>(60) * ulp);
84 constexpr T taylor_4_bound =
sqrt(
sqrt(
static_cast<T
>(2520) * ulp));
85 constexpr T taylor_6_bound =
sqrt(
cbrt(
static_cast<T
>(100800) * ulp));
86 constexpr T taylor_8_bound =
sqrt(
sqrt(
sqrt(
static_cast<T
>(3991680) * ulp)));
88 double absx = std::abs(x);
89 if(absx >= taylor_8_bound)
91 return static_cast<T
>(1) / (x * x) - (
static_cast<T
>(1) + std::cos(x)) / (
static_cast<T
>(2) * x * std::sin(x));
96 T result =
static_cast<T
>(1);
98 if(absx >= taylor_2_bound)
102 result += x2 /
static_cast<T
>(60);
104 if(absx >= taylor_4_bound)
108 result += x4 /
static_cast<T
>(2520);
109 if(absx >= taylor_6_bound)
112 result += (x2 * x4) /
static_cast<T
>(100800);
117 return result /
static_cast<T
>(12);
133 constexpr T ulp = std::numeric_limits<T>::epsilon();
134 constexpr T taylor_2_bound =
sqrt(
static_cast<T
>(21) * ulp);
135 constexpr T taylor_4_bound =
sqrt(
sqrt(
static_cast<T
>(560) * ulp));
136 constexpr T taylor_6_bound =
sqrt(
cbrt(
static_cast<T
>(16632) * ulp));
137 constexpr T taylor_8_bound =
sqrt(
sqrt(
sqrt(
static_cast<T
>(363242880) * ulp /
static_cast<T
>(691))));
138 constexpr T taylor_12_bound =
sqrt(
sqrt(
cbrt(
static_cast<T
>(2117187072000) * ulp /
static_cast<T
>(3617))));
140 double absx = std::abs(x);
141 if(absx >= taylor_12_bound)
144 return (x + std::sin(x)) / (
static_cast<T
>(2) * x2 * (1 - std::cos(x))) -
static_cast<T
>(2) / (x2 * x);
149 T result =
static_cast<T
>(1);
151 if(absx >= taylor_2_bound)
155 result += x2 /
static_cast<T
>(21);
157 if(absx >= taylor_4_bound)
161 result += x4 /
static_cast<T
>(560);
162 if(absx >= taylor_6_bound)
165 result += (x2 * x4) /
static_cast<T
>(16632);
167 if(absx >= taylor_8_bound)
171 result += (
static_cast<T
>(691) * x8) /
static_cast<T
>(363242880) + (x2 * x8) /
static_cast<T
>(17297280);
177 return x * result /
static_cast<T
>(360);
189 constexpr T taylor_0_bound = std::numeric_limits<double>::epsilon();
193 if(std::abs(x) >= taylor_n_bound)
195 return (std::sin(x) / x);
200 T result =
static_cast<T
>(1);
202 if(std::abs(x) >= taylor_0_bound)
207 result -= x2 /
static_cast<T
>(6);
209 if(std::abs(x) >= taylor_2_bound)
212 result += (x2 * x2) /
static_cast<T
>(120);
227 constexpr T taylor_0_bound = std::numeric_limits<T>::epsilon();
243 if(std::abs(x) >= taylor_n_bound)
245 return (x / std::sin(x));
252 T result =
static_cast<T
>(1);
254 if(std::abs(x) >= taylor_0_bound)
258 result += x2 /
static_cast<T
>(6);
260 if(std::abs(x) >= taylor_2_bound)
263 result +=
static_cast<T
>(7) * (x2 * x2) /
static_cast<T
>(360);
288 auto xx = f2 * u.x() * u.x();
289 auto xy = f2 * u.x() * u.y();
290 auto xz = f2 * u.x() * u.z();
291 auto yy = f2 * u.y() * u.y();
292 auto yz = f2 * u.y() * u.z();
293 auto zz = f2 * u.z() * u.z();
295 C2 << -yy - zz, xy , xz,
318 auto xx = df2 * u.x() * u.x();
319 auto xy = df2 * u.x() * u.y();
320 auto xz = df2 * u.x() * u.z();
321 auto yy = df2 * u.y() * u.y();
322 auto yz = df2 * u.y() * u.z();
323 auto zz = df2 * u.z() * u.z();
324 auto dxx = 2 * f2 * du.x() * u.x();
325 auto dyy = 2 * f2 * du.y() * u.y();
326 auto dzz = 2 * f2 * du.z() * u.z();
327 auto c12 = f2 * (du.y() * u.x() + du.x() * u.y());
328 auto c13 = f2 * (du.z() * u.x() + du.x() * u.z());
329 auto c23 = f2 * (du.z() * u.y() + du.y() * u.z());
331 C2 << -yy - zz, xy , xz,
334 C3 << -dyy - dzz, c12 , c13,
335 c12 , -dxx - dzz, c23,
336 c13 , c23 , -dxx - dyy;