2 c c++ floating-point floating-accuracy
如果浮动重复乘以小于1的数字,浮点数可能变为零是否合理?
这是一个例子:
float number = 1.0f;
for ( int i = 0; i < ONE_BILLION; ++i )
{
number *= 0.01f;
}
Run Code Online (Sandbox Code Playgroud)
但请不要限制您对示例的回答.
谢谢!
是的,当乘法的结果小于最接近零的可表示数时,它将变为零.对于IEEE浮点,任何小于或等于0.5f(但大于零)的乘数都会发生这种情况; 但是,如果乘数甚至略大于0.5f(例如0.5f + FLT_EPSILON),则结果将收敛到最小的可表示正数并永远保持在那里.比较该程序的行为是否有-DGREATER:
#include <stdio.h>
#include <float.h>
#ifdef GREATER
#define MULTIPLIER (0.5f + FLT_EPSILON)
#else
#define MULTIPLIER 0.5f
#endif
int
main(void)
{
float x = 1.0f;
unsigned int count = 0;
while (x > 0.0f && count < 200)
{
x *= MULTIPLIER;
printf("%g %a\n", x, x);
count++;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)