C/C++:浮点运算问题

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)

但请不要限制您对示例的回答.

谢谢!

zwo*_*wol 5

是的,当乘法的结果小于最接近零的可表示数时,它将变为零.对于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)