2525
2626#include " objects.h"
2727#include " float.h"
28+ #if defined(LINUX)
29+ #include < cmath>
30+ #endif
2831
2932void dInternalHandleAutoDisabling (dxWorld *world, dReal stepsize);
3033extern " C"
@@ -37,19 +40,31 @@ typedef void (*dstepper_fn_t) (dxWorld *world, dxBody * const *body, int nb,
3740
3841void dxProcessIslands (dxWorld *world, dReal stepsize, dstepper_fn_t stepper);
3942
40- inline bool dValid (const float x )
43+ inline bool dValid (const float x)
4144{
42- // check for: Signaling NaN, Quiet NaN, Negative infinity ( –INF), Positive infinity (+INF), Negative denormalized, Positive denormalized
43- int cls = _fpclass (double (x ));
44- if (cls & (_FPCLASS_SNAN + _FPCLASS_QNAN + _FPCLASS_NINF + _FPCLASS_PINF + _FPCLASS_ND + _FPCLASS_PD ))
45- return false;
46-
47- /* *****other cases are*****
48- _FPCLASS_NN Negative normalized non-zero
49- _FPCLASS_NZ Negative zero ( – 0)
50- _FPCLASS_PZ Positive 0 (+0)
51- _FPCLASS_PN Positive normalized non-zero
52- */
53- return true;
45+ #ifdef MSVC
46+ // check for: Signaling NaN, Quiet NaN, Negative infinity (-INF), Positive infinity (+INF), Negative denormalized, Positive denormalized
47+ int cls = _fpclass (double (x));
48+ if (cls&(_FPCLASS_SNAN+_FPCLASS_QNAN+_FPCLASS_NINF+_FPCLASS_PINF+_FPCLASS_ND+_FPCLASS_PD))
49+ return false ;
50+ #elif defined(LINUX)
51+ int cls = std::fpclassify ((double )x);
52+ switch (cls)
53+ {
54+ case FP_NAN:
55+ case FP_INFINITE:
56+ case FP_SUBNORMAL:
57+ return false ;
58+ default :
59+ break ;
60+ }
61+ #endif
62+ /* *****other cases are*****
63+ _FPCLASS_NN Negative normalized non-zero
64+ _FPCLASS_NZ Negative zero (-0)
65+ _FPCLASS_PZ Positive 0 (+0)
66+ _FPCLASS_PN Positive normalized non-zero
67+ */
68+ return true ;
5469}
5570#endif
0 commit comments