ref: fd731d3c833d9241fdff618b6c949453fb5c0f31
dir: /math.c/
#include <math.h> /* some of these were taken from musl */ #define ln2o1 1.4426950408889634073599 #define dbleps 2.2204460492503131e-16 #define huge 1.79769313486231e+308 static double toint = 1.0/dbleps; double round(double x) { union {double f; u64int i;} u = {x}; int e = u.i >> 52 & 0x7ff; double y; if(e >= 0x3ff+52) return x; if(u.i >> 63) x = -x; if(e < 0x3ff-1) return 0*u.f; y = x + toint - toint - x; if(y > 0.5) y = y + x - 1; else if(y <= -0.5) y = y + x + 1; else y = y + x; if(u.i >> 63) y = -y; return y; } double log2(double x) { if(x == 0) return -huge; if(x < 0 || isNaN(x)) return NaN(); return log(x)*ln2o1; } double trunc(double x) { union {double f; u64int i;} u = {x}; int e = (int)(u.i >> 52 & 0x7ff) - 0x3ff + 12; u64int m; if(e >= 52 + 12) return x; if(e < 12) e = 1; m = -1ULL >> e; if((u.i & m) == 0) return x; u.i &= ~m; return u.f; } double exp2(double x) { return exp(x/ln2o1); }