/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries * FILE: lib/sdk/crt/float/fpclass.c * PURPOSE: Floating-point classes * PROGRAMER: Pierre Schweitzer (pierre@reactos.org) * REFERENCE: http://babbage.cs.qc.cuny.edu/IEEE-754/References.xhtml */ #include #include #include /* * @implemented */ int _fpclass(double __d) { union { double* __d; double_s* d; } d; d.__d = &__d; /* With 0x7ff, it can only be infinity or NaN */ if (d.d->exponent == 0x7ff) { if (d.d->mantissah == 0 && d.d->mantissal == 0) { return (d.d->sign == 0) ? _FPCLASS_PINF : _FPCLASS_NINF; } /* Windows will never return Signaling NaN */ else { return _FPCLASS_QNAN; } } /* With 0, it can only be zero or denormalized number */ if (d.d->exponent == 0) { if (d.d->mantissah == 0 && d.d->mantissal == 0) { return (d.d->sign == 0) ? _FPCLASS_PZ : _FPCLASS_NZ; } else { return (d.d->sign == 0) ? _FPCLASS_PD : _FPCLASS_ND; } } /* Only remain normalized numbers */ else { return (d.d->sign == 0) ? _FPCLASS_PN : _FPCLASS_NN; } }