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;
201 const FXdouble GOLDENRATIO=1.6180339887498948482045868343;
210 static inline FXuint fpBits(FXfloat x){
211 union{ FXfloat f; FXuint u; } z={x};
216 static inline FXulong fpBits(FXdouble x){
217 union{ FXdouble f; FXulong u; } z={x};
223 static inline FXfloat fpFlt(FXuint bits){
224 union{ FXuint u; FXfloat f; } z={bits};
229 static inline FXdouble fpFlt(FXulong bits){
230 union{ FXulong u; FXdouble f; } z={bits};
236 static inline FXfloat fpMake(FXuint mantissa,FXuint exponent=127,FXuint sign=0){
237 return fpFlt((mantissa&0x007fffff) | ((exponent&0xff)<<23) | (sign<<31));
241 static inline FXdouble fpMake(FXulong mantissa,FXulong exponent=1023,FXulong sign=0){
242 return fpFlt((mantissa&FXLONG(0x000fffffffffffff)) | ((exponent&FXLONG(0x7ff))<<52) | (sign<<63));
247 static inline FXint fpSign(FXfloat x){
248 FXint sign=fpBits(x)>>31;
253 static inline FXlong fpSign(FXdouble x){
254 FXlong sign=fpBits(x)>>63;
260 static inline FXint fpExponent(FXfloat x){
261 FXint exponent=(fpBits(x)>>23)&0xff;
262 FXint bias=126-(-exponent>>31);
263 return exponent-bias;
267 static inline FXlong fpExponent(FXdouble x){
268 FXlong exponent=(fpBits(x)>>52)&0x7ff;
269 FXlong bias=1022-(-exponent>>63);
270 return exponent-bias;
275 static inline FXint fpMantissa(FXfloat x){
276 FXint mantissa=fpBits(x)&0x007fffff;
277 FXint exponent=fpBits(x)&0x7f800000;
278 FXint extrabit=-(-exponent>>31);
279 return mantissa|(extrabit<<23);
283 static inline FXlong fpMantissa(FXdouble x){
284 FXlong mantissa=fpBits(x)&FXLONG(0x000fffffffffffff);
285 FXlong exponent=fpBits(x)&FXLONG(0x7ff0000000000000);
286 FXlong extrabit=-(-exponent>>63);
287 return mantissa|(extrabit<<52);
292 static inline FXbool fpFinite(FXfloat x){
293 return ((fpBits(x)&0x7fffffff)<0x7f800000);
297 static inline FXbool fpFinite(FXdouble x){
298 return ((fpBits(x)&FXULONG(0x7fffffffffffffff))<FXULONG(0x7ff0000000000000));
303 static inline FXbool fpInfinite(FXfloat x){
304 return ((fpBits(x)&0x7fffffff)==0x7f800000);
308 static inline FXbool fpInfinite(FXdouble x){
309 return ((fpBits(x)&FXULONG(0x7fffffffffffffff))==FXULONG(0x7ff0000000000000));
314 static inline FXbool fpNan(FXfloat x){
315 return (0x7f800000<(fpBits(x)&0x7fffffff));
319 static inline FXbool fpNan(FXdouble x){
320 return (FXULONG(0x7ff0000000000000)<(fpBits(x)&FXULONG(0x7fffffffffffffff)));
325 static inline FXbool fpNormal(FXfloat x){
326 FXuint bits=fpBits(x)&0x7fffffff;
327 return bits==0 || (0x00800000<=bits && bits<0x7f800000);
331 static inline FXbool fpNormal(FXdouble x){
332 FXulong bits=fpBits(x)&FXULONG(0x7fffffffffffffff);
333 return (bits==0) || ((FXULONG(0x0010000000000000)<=bits) && (bits<FXULONG(0x7ff0000000000000)));
338 static inline FXint iblend(FXint a,FXint b,FXint x,FXint y){
343 static inline FXlong iblend(FXlong a,FXlong b,FXlong x,FXlong y){
349 static inline FXint imin(FXint x,FXint y){
354 static inline FXuint imin(FXuint x,FXuint y){
359 static inline FXlong imin(FXlong x,FXlong y){
364 static inline FXulong imin(FXulong x,FXulong y){
370 static inline FXint imax(FXint x,FXint y){
375 static inline FXuint imax(FXuint x,FXuint y){
381 static inline FXlong imax(FXlong x,FXlong y){
386 static inline FXulong imax(FXulong x,FXulong y){
392 static inline FXshort iabs(FXshort x){
397 static inline FXint iabs(FXint x){
402 static inline FXlong iabs(FXlong x){
408 static inline FXint iclamp(FXint lo,FXint x,FXint hi){
409 return Math::imin(Math::imax(x,lo),hi);
413 static inline FXlong iclamp(FXlong lo,FXlong x,FXlong hi){
414 return Math::imin(Math::imax(x,lo),hi);
419 static inline FXint iclamp(FXint x,FXint lim){
420 return imin(imax(x,-lim),lim);
424 static inline FXlong iclamp(FXlong x,FXlong lim){
425 return imin(imax(x,-lim),lim);
430 static inline FXint isign(FXint x){
435 static inline FXlong isign(FXlong x){
441 static inline FXfloat fmin(FXfloat x,FXfloat y){
442 #if defined(NO_FMINF) 451 static inline FXdouble fmin(FXdouble x,FXdouble y){
461 static inline FXfloat fmax(FXfloat x,FXfloat y){
462 #if defined(NO_FMAXF) 470 static inline FXdouble fmax(FXdouble x,FXdouble y){
480 static inline FXfloat fabs(FXfloat x){
481 #if defined(NO_FABSF) 482 return (x<0.0f) ? -x : x;
489 static inline FXdouble fabs(FXdouble x){
495 static inline FXfloat fclamp(FXfloat lo,FXfloat x,FXfloat hi){
496 return Math::fmin(Math::fmax(x,lo),hi);
500 static inline FXdouble fclamp(FXdouble lo,FXdouble x,FXdouble hi){
501 return Math::fmin(Math::fmax(x,lo),hi);
506 static inline FXfloat fclamp(FXfloat x,FXfloat lim){
507 return fmin(fmax(x,-lim),lim);
511 static inline FXdouble fclamp(FXdouble x,FXdouble lim){
512 return fmin(fmax(x,-lim),lim);
517 static inline FXfloat fdim(FXfloat x,FXfloat y){
518 #if defined(NO_FDIMF) 519 return Math::fmax(x-y,0.0f);
526 static inline FXdouble fdim(FXdouble x,FXdouble y){
528 return Math::fmax(x-y,0.0);
536 static inline FXfloat fmod(FXfloat x,FXfloat y){
541 static inline FXdouble fmod(FXdouble x,FXdouble y){
547 static inline FXfloat fblend(FXfloat a,FXfloat b,FXfloat x,FXfloat y){
553 static inline FXdouble fblend(FXdouble a,FXdouble b,FXdouble x,FXdouble y){
559 static inline FXfloat copysign(FXfloat x,FXfloat y){
560 #if defined(NO_COPYSIGNF) 561 union{ FXfloat f; FXuint u; } xx={x},yy={y};
563 xx.u|=(yy.u&0x80000000);
566 return ::copysignf(x,y);
571 static inline FXdouble copysign(FXdouble x,FXdouble y){
572 #if defined(NO_COPYSIGN) 573 union{ FXdouble f; FXulong u; } xx={x},yy={y};
574 xx.u&=FXULONG(0x7fffffffffffffff);
575 xx.u|=(yy.u&FXULONG(0x8000000000000000));
578 return ::copysign(x,y);
584 #if defined(NO_CEILF) 585 extern FXAPI FXfloat ceil(FXfloat x);
587 static inline FXfloat ceil(FXfloat x){ return ::ceilf(x); }
591 static inline FXdouble ceil(FXdouble x){ return ::ceil(x); }
595 #if defined(NO_FLOORF) 596 extern FXAPI FXfloat floor(FXfloat x);
598 static inline FXfloat floor(FXfloat x){ return ::floorf(x); }
602 static inline FXdouble floor(FXdouble x){ return ::floor(x); }
605 #if defined(NO_ROUNDF) 606 extern FXAPI FXfloat round(FXfloat x);
608 static inline FXfloat round(FXfloat x){ return ::roundf(x); }
612 #if defined(NO_ROUND) 613 extern FXAPI FXdouble round(FXdouble x);
615 static inline FXdouble round(FXdouble x){ return ::round(x); }
620 #if defined(NO_TRUNCF) 621 extern FXAPI FXfloat trunc(FXfloat x);
623 static inline FXfloat trunc(FXfloat x){ return ::truncf(x); }
627 #if defined(NO_TRUNC) 628 extern FXAPI FXdouble trunc(FXdouble x);
630 static inline FXdouble trunc(FXdouble x){ return ::trunc(x); }
635 #if defined(NO_NEARBYINTF) 636 extern FXAPI FXfloat nearbyint(FXfloat x);
638 static inline FXfloat nearbyint(FXfloat x){ return ::nearbyintf(x); }
642 #if defined(NO_NEARBYINT) 643 extern FXAPI FXdouble nearbyint(FXdouble x);
645 static inline FXdouble nearbyint(FXdouble x){ return ::nearbyint(x); }
649 #if defined(NO_RINTF) 650 extern FXAPI FXfloat rint(FXfloat x);
652 static inline FXfloat rint(FXfloat x){ return ::rintf(x); }
657 extern FXAPI FXdouble rint(FXdouble x);
659 static inline FXdouble rint(FXdouble x){ return ::rint(x); }
664 static inline FXint lrint(FXfloat x){
665 #if defined(NO_LRINTF) 666 return (FXint)(x+Math::copysign(0.5f,x));
668 return (FXint)::lrintf(x);
673 static inline FXlong lrint(FXdouble x){
674 #if defined(NO_LRINT) 675 return (FXlong)(x+Math::copysign(0.5,x));
677 return (FXlong)::lrint(x);
683 static inline FXfloat wrap(FXfloat x){
684 #if defined(__SSE4_1__) 685 return x-Math::nearbyint(x*0.159154943091895335768883763373f)*6.28318530717958647692528676656f;
687 return x-Math::lrint(x*0.159154943091895335768883763373f)*6.28318530717958647692528676656f;
692 static inline FXdouble wrap(FXdouble x){
693 #if defined(__SSE4_1__) 694 return x-Math::nearbyint(x*0.159154943091895335768883763373)*6.28318530717958647692528676656;
696 return x-Math::lrint(x*0.159154943091895335768883763373)*6.28318530717958647692528676656;
702 static inline FXfloat wrap4(FXfloat x){
703 return x-Math::floor(x*0.159154943091895335768883763373f)*6.28318530717958647692528676656f;
708 static inline FXdouble wrap4(FXdouble x){
709 return x-Math::floor(x*0.159154943091895335768883763373)*6.28318530717958647692528676656;
714 static inline FXfloat stepify(FXfloat x,FXfloat s){
715 return Math::nearbyint(x/s)*s;
719 static inline FXdouble stepify(FXdouble x,FXdouble s){
720 return Math::nearbyint(x/s)*s;
725 static inline FXfloat zigzag(FXfloat x){
726 return Math::fabs(2.0f*(x-Math::nearbyint(x)));
730 static inline FXdouble zigzag(FXdouble x){
731 return Math::fabs(2.0*(x-Math::nearbyint(x)));
736 static inline FXfloat sawtooth(FXfloat x){
737 return x-Math::floor(x);
741 static inline FXdouble sawtooth(FXdouble x){
742 return x-Math::floor(x);
747 static inline FXfloat rsawtooth(FXfloat x){
748 return Math::ceil(x)-x;
752 static inline FXdouble rsawtooth(FXdouble x){
753 return Math::ceil(x)-x;
758 static inline FXfloat sin(FXfloat x){
763 static inline FXdouble sin(FXdouble x){
769 static inline FXfloat cos(FXfloat x){
774 static inline FXdouble cos(FXdouble x){
780 static inline FXfloat tan(FXfloat x){
785 static inline FXdouble tan(FXdouble x){
791 static inline FXfloat asin(FXfloat x){
796 static inline FXdouble asin(FXdouble x){
802 static inline FXfloat acos(FXfloat x){
807 static inline FXdouble acos(FXdouble x){
813 static inline FXfloat atan(FXfloat x){
818 static inline FXdouble atan(FXdouble x){
824 static inline FXfloat atan2(FXfloat y,FXfloat x){
825 return ::atan2f(y,x);
829 static inline FXdouble atan2(FXdouble y,FXdouble x){
835 static inline void sincos(FXfloat x,FXfloat& s,FXfloat& c){
836 #if defined(NO_SINCOSF) 846 static inline void sincos(FXdouble x,FXdouble& s,FXdouble& c){
847 #if defined(NO_SINCOS) 857 #if defined(NO_SINHF) 858 extern FXAPI FXfloat sinh(FXfloat x);
860 static inline FXfloat sinh(FXfloat x){ return ::sinhf(x); }
865 extern FXAPI FXdouble sinh(FXdouble x);
867 static inline FXdouble sinh(FXdouble x){ return ::sinh(x); }
872 #if defined(NO_COSHF) 873 extern FXAPI FXfloat cosh(FXfloat x);
875 static inline FXfloat cosh(FXfloat x){ return ::coshf(x); }
880 extern FXAPI FXdouble cosh(FXdouble x);
882 static inline FXdouble cosh(FXdouble x){ return ::cosh(x); }
887 #if defined(NO_TANHF) 888 extern FXAPI FXfloat tanh(FXfloat x);
890 static inline FXfloat tanh(FXfloat x){ return ::tanhf(x); }
895 extern FXAPI FXdouble tanh(FXdouble x);
897 static inline FXdouble tanh(FXdouble x){ return ::tanh(x); }
902 #if defined(NO_ASINHF) 903 extern FXAPI FXfloat asinh(FXfloat x);
905 static inline FXfloat asinh(FXfloat x){ return ::asinhf(x); }
909 #if defined(NO_ASINH) 910 extern FXAPI FXdouble asinh(FXdouble x);
912 static inline FXdouble asinh(FXdouble x){ return ::asinh(x); }
917 #if defined(NO_ACOSHF) 918 extern FXAPI FXfloat acosh(FXfloat x);
920 static inline FXfloat acosh(FXfloat x){ return ::acoshf(x); }
924 #if defined(NO_ACOSH) 925 extern FXAPI FXdouble acosh(FXdouble x);
927 static inline FXdouble acosh(FXdouble x){ return ::acosh(x); }
932 #if defined(NO_ATANHF) 933 extern FXAPI FXfloat atanh(FXfloat x);
935 static inline FXfloat atanh(FXfloat x){ return ::atanhf(x); }
939 #if defined(NO_ATANH) 940 extern FXAPI FXdouble atanh(FXdouble x);
942 static inline FXdouble atanh(FXdouble x){ return ::atanh(x); }
947 static inline FXfloat sqrt(FXfloat x){
952 static inline FXdouble sqrt(FXdouble x){
958 static inline FXfloat safesqrt(FXfloat x){
959 return Math::sqrt(Math::fmax(x,0.0f));
963 static inline FXdouble safesqrt(FXdouble x){
964 return Math::sqrt(Math::fmax(x,0.0));
969 static inline FXfloat cbrt(FXfloat x){
970 #if defined(NO_CBRTF) 971 return ::powf(x,0.333333333333333333333333333333f);
978 static inline FXdouble cbrt(FXdouble x){
980 return ::pow(x,0.333333333333333333333333333333);
988 static inline FXfloat sqr(FXfloat x){
993 static inline FXdouble sqr(FXdouble x){
999 static inline FXfloat cub(FXfloat x){
1004 static inline FXdouble cub(FXdouble x){
1010 static inline FXfloat rsqrt(FXfloat x){
1011 return 1.0f/Math::sqrt(x);
1016 static inline FXdouble rsqrt(FXdouble x){
1017 return 1.0/Math::sqrt(x);
1022 static inline FXfloat recip(FXfloat x){
1028 static inline FXdouble recip(FXdouble x){
1034 static inline FXfloat hypot(FXfloat x,FXfloat y){
1035 #if defined(NO_HYPOTF) 1036 return Math::sqrt(Math::sqr(x)+Math::sqr(y));
1038 return ::hypotf(x,y);
1043 static inline FXdouble hypot(FXdouble x,FXdouble y){
1044 #if defined(NO_HYPOT) 1045 return Math::sqrt(Math::sqr(x)+Math::sqr(y));
1047 return ::hypot(x,y);
1053 static inline FXfloat lerp(FXfloat u,FXfloat v,FXfloat f){
1059 static inline FXdouble lerp(FXdouble u,FXdouble v,FXdouble f){
1065 static inline FXfloat smoothstep(FXfloat f){
1066 return (3.0f-2.0f*f)*f*f;
1070 static inline FXdouble smoothstep(FXdouble f){
1071 return (3.0-2.0*f)*f*f;
1076 static inline FXfloat exp(FXfloat x){
1081 static inline FXdouble exp(FXdouble x){
1087 static inline FXfloat expm1(FXfloat x){
1088 #if defined(NO_EXPM1F) 1089 return ::expf(x)-1.0f;
1096 static inline FXdouble expm1(FXdouble x){
1097 #if defined(NO_EXPM1) 1098 return ::exp(x)-1.0;
1106 static inline FXfloat pow(FXfloat x,FXfloat y){
1111 static inline FXdouble pow(FXdouble x,FXdouble y){
1117 static inline FXfloat exp2(FXfloat x){
1118 #if defined(NO_EXP2F) 1119 return Math::pow(2.0f,x);
1127 static inline FXdouble exp2(FXdouble x){
1128 #if defined(NO_EXP2) 1129 return Math::pow(2.0,x);
1137 static inline FXfloat exp10(FXfloat x){
1138 #if defined(NO_EXP10F) 1139 return Math::pow(10.0f,x);
1147 static inline FXdouble exp10(FXdouble x){
1148 #if defined(NO_EXP10) 1149 return Math::pow(10.0,x);
1157 static inline FXfloat pow10(FXfloat x){
1158 return Math::exp10(x);
1162 static inline FXdouble pow10(FXdouble x){
1163 return Math::exp10(x);
1168 extern FXAPI FXdouble pow10i(FXint ex);
1172 extern FXAPI FXfloat powi(FXfloat base,FXint ex);
1176 extern FXAPI FXdouble powi(FXdouble base,FXint ex);
1180 static inline FXfloat log(FXfloat x){
1185 static inline FXdouble log(FXdouble x){
1191 static inline FXfloat log1p(FXfloat x){
1192 #if defined(NO_LOG1PF) 1193 return Math::log(1.0f+x);
1201 static inline FXdouble log1p(FXdouble x){
1202 #if defined(NO_LOG1P) 1203 return Math::log(1.0+x);
1211 static inline FXfloat log2(FXfloat x){
1212 #if defined(NO_LOG2F) 1213 return Math::log(x)*1.442695040888963407359924681001892137f;
1221 static inline FXdouble log2(FXdouble x){
1222 #if defined(NO_LOG2) 1223 return Math::log(x)*1.442695040888963407359924681001892137;
1231 static inline FXfloat log10(FXfloat x){
1236 static inline FXdouble log10(FXdouble x){
1242 extern FXAPI FXfloat erf(FXfloat x);
1245 extern FXAPI FXdouble erf(FXdouble x);
1249 extern FXAPI FXfloat erfc(FXfloat x);
1252 extern FXAPI FXdouble erfc(FXdouble x);
1256 extern FXAPI FXfloat inverf(FXfloat x);
1259 extern FXAPI FXdouble inverf(FXdouble x);
1263 extern FXAPI FXfloat inverfc(FXfloat x);
1266 extern FXAPI FXdouble inverfc(FXdouble x);
Definition: FX4Splitter.h:28