16 #ifndef INCLUDED_IMATHROOTS_H
17 #define INCLUDED_IMATHROOTS_H
27 #if defined(__CUDACC__) || defined(__HIP__)
28 # include <thrust/complex.h>
29 # define COMPLEX_NAMESPACE thrust
31 # define COMPLEX_NAMESPACE std
36 IMATH_INTERNAL_NAMESPACE_HEADER_ENTER
112 IMATH_CONSTEXPR14
int
118 T D = b * b - 4 * a *
c;
123 T q = -(b + (b > 0 ? 1 : -1) * s) /
T (2);
142 IMATH_CONSTEXPR14
int
145 T p = (3 * s - r *
r) / 3;
146 T q = 2 * r * r * r / 27 - r * s / 3 +
t;
149 T D = p3 * p3 * p3 + q2 * q2;
151 if (D == 0 && p3 == 0)
161 auto real_root = [] (
T a,
T x) ->
T {
162 T sign = std::copysign (
T (1), a);
163 return sign *
std::pow (sign * a,
T (1) / x);
167 T v = -p / (
T (3) * u);
169 x[0] = u + v - r / 3;
173 namespace CN = COMPLEX_NAMESPACE;
176 CN::complex<T>
v = -p / (
T (3) * u);
178 const T sqrt3 =
T (1.73205080756887729352744634150587);
180 CN::complex<T> y0 (u + v);
182 -(u + v) /
T (2) + (u - v) /
T (2) * CN::complex<T> (0, sqrt3));
184 -(u + v) /
T (2) - (u - v) /
T (2) * CN::complex<T> (0, sqrt3));
188 x[0] = y0.real () - r / 3;
189 x[1] = y1.real () - r / 3;
194 x[0] = y0.real () - r / 3;
195 x[1] = y1.real () - r / 3;
196 x[2] = y2.real () - r / 3;
202 IMATH_CONSTEXPR14
int
212 IMATH_INTERNAL_NAMESPACE_HEADER_EXIT
214 #endif // INCLUDED_IMATHROOTS_H
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 int solveCubic(T a, T b, T c, T d, T x[3])
vfloat4 sqrt(const vfloat4 &a)
GLboolean GLboolean GLboolean GLboolean a
GLdouble GLdouble GLdouble q
ImageBuf OIIO_API pow(const ImageBuf &A, cspan< float > B, ROI roi={}, int nthreads=0)
IMATH_INTERNAL_NAMESPACE_HEADER_ENTER IMATH_HOSTDEVICE IMATH_CONSTEXPR14 int solveLinear(T a, T b, T &x)
IMATH_HOSTDEVICE constexpr int sign(T a) IMATH_NOEXCEPT
GLboolean GLboolean GLboolean b
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 int solveNormalizedCubic(T r, T s, T t, T x[3])
GLdouble GLdouble GLdouble y2
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 int solveQuadratic(T a, T b, T c, T x[2])