7 int fpclassify(float e)
17 bool isfinite(float e)
19 return !(isnan(e) || isinf(e));
23 return (e != 0) && (e + e == e);
30 bool isnormal(float e)
41 return log(e + sqrt(e*e - 1));
45 return log(e + sqrt(e*e + 1));
49 return 0.5 * log((1+e) / (1-e));
53 return 0.5 * (exp(e) + exp(-e));
57 return 0.5 * (exp(e) - exp(-e));
61 return sinh(e) / cosh(e);
87 return floor(log2(fabs(e)));
89 float ldexp(float e, int e)
93 float logn(float e, float base)
95 return log(e) / log(base);
99 return log(e) * M_LOG10E;
107 return log(e) * M_LOG2E;
111 return floor(log2(fabs(e)));
115 return '1 0 0' * (f - trunc(f)) + '0 1 0' * trunc(f);
118 float scalbn(float e, int n)
120 return e * pow(2, n);
125 return copysign(pow(fabs(e), 1.0/3.0), e);
127 float hypot(float e, float f)
129 return sqrt(e*e + f*f);
134 // approximation taken from wikipedia
137 return copysign(sqrt(1 - exp(-f * (1.273239544735163 + 0.14001228868667 * f) / (1 + 0.14001228868667 * f))), e);
143 vector lgamma(float e)
145 // TODO improve accuracy
147 return fabs(e) * '1 0 0' + copysign(1, e) * '0 1 0';
148 if(e < 1 && e == floor(e))
149 return nan("gamma") * '1 1 1';
154 // reflection formula:
155 // gamma(1-z) * gamma(z) = pi / sin(pi*z)
156 // lgamma(1-z) + lgamma(z) = log(pi) - log(sin(pi*z))
157 // sign of gamma(1-z) = sign of gamma(z) * sign of sin(pi*z)
159 v.x = log(M_PI) - log(fabs(v.z)) - v.x;
166 return lgamma(e + 1) - log(e) * '1 0 0';
168 return (0.5 * log(2 * M_PI * e) + e * (log(e) - 1)) * '1 0 0' + '0 1 0';
170 float tgamma(float e)
172 vector v = lgamma(e);
173 return exp(v.x) * v.y;
185 float pymod(float e, float f)
187 return e - f * floor(e / f);
190 float nearbyint(float e)
196 return (e>=0) ? floor(e) : ceil(e);
199 float fmod(float e, float f)
201 return e - f * trunc(e / f);
203 float remainder(float e, float f)
205 return e - f * rint(e / f);
207 vector remquo(float e, float f)
216 float copysign(float e, float f)
218 return fabs(e) * ((f>0) ? 1 : -1);
220 float nan(string tag)
224 float nextafter(float e, float f)
228 return nan("nextafter");
230 return -nextafter(-e, -f);
231 // now we know that e < f
232 // so we need the next number > e
234 d = max(fabs(e), 0.00000000000000000000001);
245 float nexttoward(float e, float f)
247 return nextafter(e, f);
250 float fdim(float e, float f)
254 float fmax(float e, float f)
258 float fmin(float e, float f)
262 float fma(float e, float f, float g)
267 int isgreater(float e, float f)
271 int isgreaterequal(float e, float f)
275 int isless(float e, float f)
279 int islessequal(float e, float f)
283 int islessgreater(float e, float f)
285 return e < f || e > f;
287 int isunordered(float e, float f)
289 return !(e < f || e == f || e > f);