115 #if defined(WIN32) && (defined(_MSC_VER) || defined(__MINGW32__)) 122 #define NO_NEARBYINTF 169 #if defined(__sun__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__APPLE__) 175 #if defined(__APPLE__) 186 const FXdouble PI=3.1415926535897932384626433833;
189 const FXdouble EULER=2.7182818284590452353602874713;
192 const FXdouble DTOR=0.0174532925199432957692369077;
195 const FXdouble RTOD=57.295779513082320876798154814;
198 const FXdouble FEIGENBAUM=4.6692016091029906718532038215;
207 static inline FXuint fpBits(FXfloat x){
208 union{ FXfloat f; FXuint u; } z={x};
213 static inline FXulong fpBits(FXdouble x){
214 union{ FXdouble f; FXulong u; } z={x};
220 static inline FXint fpSign(FXfloat x){
221 FXint sign=fpBits(x)>>31;
226 static inline FXlong fpSign(FXdouble x){
227 FXlong sign=fpBits(x)>>63;
233 static inline FXint fpExponent(FXfloat x){
234 FXint exponent=(fpBits(x)>>23)&0xff;
235 FXint bias=126-(-exponent>>31);
236 return exponent-bias;
240 static inline FXlong fpExponent(FXdouble x){
241 FXlong exponent=(fpBits(x)>>52)&0x7ff;
242 FXlong bias=1022-(-exponent>>63);
243 return exponent-bias;
248 static inline FXint fpMantissa(FXfloat x){
249 FXint mantissa=fpBits(x)&0x007fffff;
250 FXint exponent=fpBits(x)&0x7f800000;
251 FXint extrabit=-(-exponent>>31);
252 return mantissa|(extrabit<<23);
256 static inline FXlong fpMantissa(FXdouble x){
257 FXlong mantissa=fpBits(x)&FXLONG(0x000fffffffffffff);
258 FXlong exponent=fpBits(x)&FXLONG(0x7ff0000000000000);
259 FXlong extrabit=-(-exponent>>63);
260 return mantissa|(extrabit<<52);
265 static inline FXbool fpFinite(FXfloat x){
266 return ((fpBits(x)&0x7fffffff)<0x7f800000);
270 static inline FXbool fpFinite(FXdouble x){
271 return ((fpBits(x)&FXULONG(0x7fffffffffffffff))<FXULONG(0x7ff0000000000000));
276 static inline FXbool fpInfinite(FXfloat x){
277 return ((fpBits(x)&0x7fffffff)==0x7f800000);
281 static inline FXbool fpInfinite(FXdouble x){
282 return ((fpBits(x)&FXULONG(0x7fffffffffffffff))==FXULONG(0x7ff0000000000000));
287 static inline FXbool fpNan(FXfloat x){
288 return (0x7f800000<(fpBits(x)&0x7fffffff));
292 static inline FXbool fpNan(FXdouble x){
293 return (FXULONG(0x7ff0000000000000)<(fpBits(x)&FXULONG(0x7fffffffffffffff)));
298 static inline FXbool fpNormal(FXfloat x){
299 FXuint bits=fpBits(x)&0x7fffffff;
300 return bits==0 || (0x00800000<=bits && bits<0x7f800000);
304 static inline FXbool fpNormal(FXdouble x){
305 FXulong bits=fpBits(x)&FXULONG(0x7fffffffffffffff);
306 return (bits==0) || ((FXULONG(0x0010000000000000)<=bits) && (bits<FXULONG(0x7ff0000000000000)));
311 static inline FXint iblend(FXint a,FXint b,FXint x,FXint y){
316 static inline FXlong iblend(FXlong a,FXlong b,FXlong x,FXlong y){
322 static inline FXint imin(FXint x,FXint y){
327 static inline FXuint imin(FXuint x,FXuint y){
332 static inline FXlong imin(FXlong x,FXlong y){
337 static inline FXulong imin(FXulong x,FXulong y){
343 static inline FXint imax(FXint x,FXint y){
348 static inline FXuint imax(FXuint x,FXuint y){
354 static inline FXlong imax(FXlong x,FXlong y){
359 static inline FXulong imax(FXulong x,FXulong y){
365 static inline FXshort iabs(FXshort x){
370 static inline FXint iabs(FXint x){
375 static inline FXlong iabs(FXlong x){
381 static inline FXint iclamp(FXint lo,FXint x,FXint hi){
382 return Math::imin(Math::imax(x,lo),hi);
386 static inline FXlong iclamp(FXlong lo,FXlong x,FXlong hi){
387 return Math::imin(Math::imax(x,lo),hi);
392 static inline FXint iclamp(FXint x,FXint lim){
393 return imin(imax(x,-lim),lim);
397 static inline FXlong iclamp(FXlong x,FXlong lim){
398 return imin(imax(x,-lim),lim);
403 static inline FXint isign(FXint x){
408 static inline FXlong isign(FXlong x){
414 static inline FXfloat fmin(FXfloat x,FXfloat y){
415 #if defined(NO_FMINF) 424 static inline FXdouble fmin(FXdouble x,FXdouble y){
434 static inline FXfloat fmax(FXfloat x,FXfloat y){
435 #if defined(NO_FMAXF) 443 static inline FXdouble fmax(FXdouble x,FXdouble y){
453 static inline FXfloat fabs(FXfloat x){
454 #if defined(NO_FABSF) 455 return (x<0.0f) ? -x : x;
462 static inline FXdouble fabs(FXdouble x){
468 static inline FXfloat fclamp(FXfloat lo,FXfloat x,FXfloat hi){
469 return Math::fmin(Math::fmax(x,lo),hi);
473 static inline FXdouble fclamp(FXdouble lo,FXdouble x,FXdouble hi){
474 return Math::fmin(Math::fmax(x,lo),hi);
479 static inline FXfloat fclamp(FXfloat x,FXfloat lim){
480 return fmin(fmax(x,-lim),lim);
484 static inline FXdouble fclamp(FXdouble x,FXdouble lim){
485 return fmin(fmax(x,-lim),lim);
490 static inline FXfloat fdim(FXfloat x,FXfloat y){
491 #if defined(NO_FDIMF) 492 return Math::fmax(x-y,0.0f);
499 static inline FXdouble fdim(FXdouble x,FXdouble y){
501 return Math::fmax(x-y,0.0);
509 static inline FXfloat fmod(FXfloat x,FXfloat y){
514 static inline FXdouble fmod(FXdouble x,FXdouble y){
520 static inline FXfloat fblend(FXfloat a,FXfloat b,FXfloat x,FXfloat y){
526 static inline FXdouble fblend(FXdouble a,FXdouble b,FXdouble x,FXdouble y){
532 static inline FXfloat copysign(FXfloat x,FXfloat y){
533 #if defined(NO_COPYSIGNF) 534 union{ FXfloat f; FXuint u; } xx={x},yy={y};
536 xx.u|=(yy.u&0x80000000);
539 return ::copysignf(x,y);
544 static inline FXdouble copysign(FXdouble x,FXdouble y){
545 #if defined(NO_COPYSIGN) 546 union{ FXdouble f; FXulong u; } xx={x},yy={y};
547 xx.u&=FXULONG(0x7fffffffffffffff);
548 xx.u|=(yy.u&FXULONG(0x8000000000000000));
551 return ::copysign(x,y);
557 #if defined(NO_CEILF) 558 extern FXAPI FXfloat ceil(FXfloat x);
560 static inline FXfloat ceil(FXfloat x){ return ::ceilf(x); }
564 static inline FXdouble ceil(FXdouble x){ return ::ceil(x); }
568 #if defined(NO_FLOORF) 569 extern FXAPI FXfloat floor(FXfloat x);
571 static inline FXfloat floor(FXfloat x){ return ::floorf(x); }
575 static inline FXdouble floor(FXdouble x){ return ::floor(x); }
578 #if defined(NO_ROUNDF) 579 extern FXAPI FXfloat round(FXfloat x);
581 static inline FXfloat round(FXfloat x){ return ::roundf(x); }
585 #if defined(NO_ROUND) 586 extern FXAPI FXdouble round(FXdouble x);
588 static inline FXdouble round(FXdouble x){ return ::round(x); }
593 #if defined(NO_TRUNCF) 594 extern FXAPI FXfloat trunc(FXfloat x);
596 static inline FXfloat trunc(FXfloat x){ return ::truncf(x); }
600 #if defined(NO_TRUNC) 601 extern FXAPI FXdouble trunc(FXdouble x);
603 static inline FXdouble trunc(FXdouble x){ return ::trunc(x); }
608 #if defined(NO_NEARBYINTF) 609 extern FXAPI FXfloat nearbyint(FXfloat x);
611 static inline FXfloat nearbyint(FXfloat x){ return ::nearbyintf(x); }
615 #if defined(NO_NEARBYINT) 616 extern FXAPI FXdouble nearbyint(FXdouble x);
618 static inline FXdouble nearbyint(FXdouble x){ return ::nearbyint(x); }
622 #if defined(NO_RINTF) 623 extern FXAPI FXfloat rint(FXfloat x);
625 static inline FXfloat rint(FXfloat x){ return ::rintf(x); }
630 extern FXAPI FXdouble rint(FXdouble x);
632 static inline FXdouble rint(FXdouble x){ return ::rint(x); }
637 static inline FXint lrint(FXfloat x){
638 #if defined(NO_LRINTF) 639 return (FXint)(x+Math::copysign(0.5f,x));
641 return (FXint)::lrintf(x);
646 static inline FXlong lrint(FXdouble x){
647 #if defined(NO_LRINT) 648 return (FXlong)(x+Math::copysign(0.5,x));
650 return (FXlong)::lrint(x);
656 static inline FXfloat wrap(FXfloat x){
657 #if defined(__SSE4_1__) 658 return x-Math::nearbyint(x*0.159154943091895335768883763373f)*6.28318530717958647692528676656f;
660 return x-Math::lrint(x*0.159154943091895335768883763373f)*6.28318530717958647692528676656f;
665 static inline FXdouble wrap(FXdouble x){
666 #if defined(__SSE4_1__) 667 return x-Math::nearbyint(x*0.159154943091895335768883763373)*6.28318530717958647692528676656;
669 return x-Math::lrint(x*0.159154943091895335768883763373)*6.28318530717958647692528676656;
675 static inline FXfloat wrap4(FXfloat x){
676 return x-Math::floor(x*0.159154943091895335768883763373f)*6.28318530717958647692528676656f;
681 static inline FXdouble wrap4(FXdouble x){
682 return x-Math::floor(x*0.159154943091895335768883763373)*6.28318530717958647692528676656;
687 static inline FXfloat stepify(FXfloat x,FXfloat s){
688 return Math::nearbyint(x/s)*s;
692 static inline FXdouble stepify(FXdouble x,FXdouble s){
693 return Math::nearbyint(x/s)*s;
698 static inline FXfloat zigzag(FXfloat x){
699 return Math::fabs(2.0f*(x-Math::nearbyint(x)));
703 static inline FXdouble zigzag(FXdouble x){
704 return Math::fabs(2.0*(x-Math::nearbyint(x)));
709 static inline FXfloat sawtooth(FXfloat x){
710 return x-Math::floor(x);
714 static inline FXdouble sawtooth(FXdouble x){
715 return x-Math::floor(x);
720 static inline FXfloat rsawtooth(FXfloat x){
721 return Math::ceil(x)-x;
725 static inline FXdouble rsawtooth(FXdouble x){
726 return Math::ceil(x)-x;
731 static inline FXfloat sin(FXfloat x){
736 static inline FXdouble sin(FXdouble x){
742 static inline FXfloat cos(FXfloat x){
747 static inline FXdouble cos(FXdouble x){
753 static inline FXfloat tan(FXfloat x){
758 static inline FXdouble tan(FXdouble x){
764 static inline FXfloat asin(FXfloat x){
769 static inline FXdouble asin(FXdouble x){
775 static inline FXfloat acos(FXfloat x){
780 static inline FXdouble acos(FXdouble x){
786 static inline FXfloat atan(FXfloat x){
791 static inline FXdouble atan(FXdouble x){
797 static inline FXfloat atan2(FXfloat y,FXfloat x){
798 return ::atan2f(y,x);
802 static inline FXdouble atan2(FXdouble y,FXdouble x){
808 static inline void sincos(FXfloat x,FXfloat& s,FXfloat& c){
809 #if defined(NO_SINCOSF) 819 static inline void sincos(FXdouble x,FXdouble& s,FXdouble& c){
820 #if defined(NO_SINCOS) 830 #if defined(NO_SINHF) 831 extern FXAPI FXfloat sinh(FXfloat x);
833 static inline FXfloat sinh(FXfloat x){ return ::sinhf(x); }
838 extern FXAPI FXdouble sinh(FXdouble x);
840 static inline FXdouble sinh(FXdouble x){ return ::sinh(x); }
845 #if defined(NO_COSHF) 846 extern FXAPI FXfloat cosh(FXfloat x);
848 static inline FXfloat cosh(FXfloat x){ return ::coshf(x); }
853 extern FXAPI FXdouble cosh(FXdouble x);
855 static inline FXdouble cosh(FXdouble x){ return ::cosh(x); }
860 #if defined(NO_TANHF) 861 extern FXAPI FXfloat tanh(FXfloat x);
863 static inline FXfloat tanh(FXfloat x){ return ::tanhf(x); }
868 extern FXAPI FXdouble tanh(FXdouble x);
870 static inline FXdouble tanh(FXdouble x){ return ::tanh(x); }
875 #if defined(NO_ASINHF) 876 extern FXAPI FXfloat asinh(FXfloat x);
878 static inline FXfloat asinh(FXfloat x){ return ::asinhf(x); }
882 #if defined(NO_ASINH) 883 extern FXAPI FXdouble asinh(FXdouble x);
885 static inline FXdouble asinh(FXdouble x){ return ::asinh(x); }
890 #if defined(NO_ACOSHF) 891 extern FXAPI FXfloat acosh(FXfloat x);
893 static inline FXfloat acosh(FXfloat x){ return ::acoshf(x); }
897 #if defined(NO_ACOSH) 898 extern FXAPI FXdouble acosh(FXdouble x);
900 static inline FXdouble acosh(FXdouble x){ return ::acosh(x); }
905 #if defined(NO_ATANHF) 906 extern FXAPI FXfloat atanh(FXfloat x);
908 static inline FXfloat atanh(FXfloat x){ return ::atanhf(x); }
912 #if defined(NO_ATANH) 913 extern FXAPI FXdouble atanh(FXdouble x);
915 static inline FXdouble atanh(FXdouble x){ return ::atanh(x); }
920 static inline FXfloat sqrt(FXfloat x){
925 static inline FXdouble sqrt(FXdouble x){
931 static inline FXfloat safesqrt(FXfloat x){
932 return Math::sqrt(Math::fmax(x,0.0f));
936 static inline FXdouble safesqrt(FXdouble x){
937 return Math::sqrt(Math::fmax(x,0.0));
942 static inline FXfloat cbrt(FXfloat x){
943 #if defined(NO_CBRTF) 944 return ::powf(x,0.333333333333333333333333333333f);
951 static inline FXdouble cbrt(FXdouble x){
953 return ::pow(x,0.333333333333333333333333333333);
961 static inline FXfloat sqr(FXfloat x){
966 static inline FXdouble sqr(FXdouble x){
972 static inline FXfloat cub(FXfloat x){
977 static inline FXdouble cub(FXdouble x){
983 static inline FXfloat rsqrt(FXfloat x){
984 return 1.0f/Math::sqrt(x);
989 static inline FXdouble rsqrt(FXdouble x){
990 return 1.0/Math::sqrt(x);
995 static inline FXfloat hypot(FXfloat x,FXfloat y){
996 #if defined(NO_HYPOTF) 997 return Math::sqrt(Math::sqr(x)+Math::sqr(y));
999 return ::hypotf(x,y);
1004 static inline FXdouble hypot(FXdouble x,FXdouble y){
1005 #if defined(NO_HYPOT) 1006 return Math::sqrt(Math::sqr(x)+Math::sqr(y));
1008 return ::hypot(x,y);
1014 static inline FXfloat lerp(FXfloat u,FXfloat v,FXfloat f){
1020 static inline FXdouble lerp(FXdouble u,FXdouble v,FXdouble f){
1026 static inline FXfloat smoothstep(FXfloat f){
1027 return (3.0f-2.0f*f)*f*f;
1031 static inline FXdouble smoothstep(FXdouble f){
1032 return (3.0-2.0*f)*f*f;
1037 static inline FXfloat exp(FXfloat x){
1042 static inline FXdouble exp(FXdouble x){
1048 static inline FXfloat expm1(FXfloat x){
1049 #if defined(NO_EXPM1F) 1050 return ::expf(x)-1.0f;
1057 static inline FXdouble expm1(FXdouble x){
1058 #if defined(NO_EXPM1) 1059 return ::exp(x)-1.0;
1067 static inline FXfloat pow(FXfloat x,FXfloat y){
1072 static inline FXdouble pow(FXdouble x,FXdouble y){
1078 static inline FXfloat exp2(FXfloat x){
1079 #if defined(NO_EXP2F) 1080 return Math::pow(2.0f,x);
1088 static inline FXdouble exp2(FXdouble x){
1089 #if defined(NO_EXP2) 1090 return Math::pow(2.0,x);
1098 static inline FXfloat exp10(FXfloat x){
1099 #if defined(NO_EXP10F) 1100 return Math::pow(10.0f,x);
1108 static inline FXdouble exp10(FXdouble x){
1109 #if defined(NO_EXP10) 1110 return Math::pow(10.0,x);
1118 static inline FXfloat pow10(FXfloat x){
1119 return Math::exp10(x);
1123 static inline FXdouble pow10(FXdouble x){
1124 return Math::exp10(x);
1129 extern FXAPI FXdouble pow10i(FXint ex);
1133 extern FXAPI FXfloat powi(FXfloat base,FXint ex);
1137 extern FXAPI FXdouble powi(FXdouble base,FXint ex);
1141 static inline FXfloat log(FXfloat x){
1146 static inline FXdouble log(FXdouble x){
1152 static inline FXfloat log1p(FXfloat x){
1153 #if defined(NO_LOG1PF) 1154 return Math::log(1.0f+x);
1162 static inline FXdouble log1p(FXdouble x){
1163 #if defined(NO_LOG1P) 1164 return Math::log(1.0+x);
1172 static inline FXfloat log2(FXfloat x){
1173 #if defined(NO_LOG2F) 1174 return Math::log(x)*1.442695040888963407359924681001892137f;
1182 static inline FXdouble log2(FXdouble x){
1183 #if defined(NO_LOG2) 1184 return Math::log(x)*1.442695040888963407359924681001892137;
1192 static inline FXfloat log10(FXfloat x){
1197 static inline FXdouble log10(FXdouble x){
1203 static inline FXuint hash32(FXuint x){
1204 x=((x>>16)^x)*0x21F0AAAD;
1205 x=((x>>15)^x)*0x735A2D97;
1211 static inline FXuint unhash32(FXuint x){
1212 x=((x>>15)^(x>>30)^x)*0x97132227;
1213 x=((x>>15)^(x>>30)^x)*0x333C4925;
1220 static inline FXulong hash64(FXulong x){
1221 x=(x^(x>>30))*FXULONG(0xBF58476D1CE4E5B9);
1222 x=(x^(x>>27))*FXULONG(0x94D049BB133111EB);
1228 static inline FXulong unhash64(FXulong x){
1229 x=(x^(x>>31)^(x>>62))*FXULONG(0x319642B2D24D8EC3);
1230 x=(x^(x>>27)^(x>>54))*FXULONG(0x96DE1B173F119089);
1231 x=x^(x>>30)^(x>>60);
1237 static inline FXuint hash32(FXfloat x){
1238 return x!=0.0f ? hash32(fpBits(x)) : 0;
1243 static inline FXulong hash64(FXdouble x){
1244 return x!=0.0 ? hash64(fpBits(x)) : 0;
1249 extern FXAPI FXfloat erf(FXfloat x);
1252 extern FXAPI FXdouble erf(FXdouble x);
1256 extern FXAPI FXfloat erfc(FXfloat x);
1259 extern FXAPI FXdouble erfc(FXdouble x);
1263 extern FXAPI FXfloat inverf(FXfloat x);
1266 extern FXAPI FXdouble inverf(FXdouble x);
1270 extern FXAPI FXfloat inverfc(FXfloat x);
1273 extern FXAPI FXdouble inverfc(FXdouble x);
Definition: FX4Splitter.h:28