Why does pow
(math.h
or cmath
) not returning denormalized numbers? For example, this:
float f = pow (2.f, -126);
double d = pow (2.0, -1022);
gives a non-zero answer for f
and d
, but using a smaller exponent, i.e -127 for f
and -1023
for d
, returns a zero, although even 2 ^ -149
(for singles) and 2 ^ -1074
(for doubles) are still representable (as IEEE-754 'denormalized').
Compiler is Microsoft's VS2008, debug confi开发者_运维技巧g.
It sounds like VC is flushing denormals. This can be controlled by the following:
#include <float.h>
#pragma fenv_access (on)
int main()
{
_controlfp(_DN_SAVE, _MCW_DN);
float f = pow (2.f, -127);
double d = pow (2.0, -1023);
}
精彩评论