mirror of
https://github.com/reactos/reactos.git
synced 2025-06-01 07:28:19 +00:00
[CRT]
Reimplemented _fpclass properly. This fixes all failing _fpclass tests. See: http://babbage.cs.qc.cuny.edu/IEEE-754/References.xhtml Based on OpenAD implementation svn path=/trunk/; revision=54435
This commit is contained in:
parent
a3e46bb8dd
commit
30419eda7c
1 changed files with 34 additions and 28 deletions
|
@ -3,9 +3,8 @@
|
|||
* PROJECT: ReactOS system libraries
|
||||
* FILE: lib/sdk/crt/float/fpclass.c
|
||||
* PURPOSE: Floating-point classes
|
||||
* PROGRAMER: Unknown
|
||||
* UPDATE HISTORY:
|
||||
* 25/11/05: Added license header
|
||||
* PROGRAMER: Pierre Schweitzer (pierre@reactos.org)
|
||||
* REFERENCE: http://babbage.cs.qc.cuny.edu/IEEE-754/References.xhtml
|
||||
*/
|
||||
|
||||
#include <precomp.h>
|
||||
|
@ -24,29 +23,36 @@ int _fpclass(double __d)
|
|||
} d;
|
||||
d.__d = &__d;
|
||||
|
||||
if ( d.d->exponent == 0 ) {
|
||||
if ( d.d->mantissah == 0 && d.d->mantissal == 0 ) {
|
||||
if ( d.d->sign == 0 )
|
||||
return _FPCLASS_PZ;
|
||||
else
|
||||
return _FPCLASS_NZ;
|
||||
} else {
|
||||
if ( d.d->sign == 0 )
|
||||
return _FPCLASS_PD;
|
||||
else
|
||||
return _FPCLASS_ND;
|
||||
}
|
||||
}
|
||||
else if (d.d->exponent == 0x7ff ) {
|
||||
if ( d.d->mantissah == 0 && d.d->mantissal == 0 ) {
|
||||
if ( d.d->sign == 0 )
|
||||
return _FPCLASS_PINF;
|
||||
else
|
||||
return _FPCLASS_NINF;
|
||||
}
|
||||
else if ( (d.d->mantissah & 0x80000) != 0 ) {
|
||||
return _FPCLASS_QNAN;
|
||||
}
|
||||
}
|
||||
return _FPCLASS_QNAN;
|
||||
|
||||
/* 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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue