小编dun*_*cks的帖子

在IEEE 754中跳过"零测试"检查

我在一本关于计算机图形的流行书中读到了这个,

如果程序员利用IEEE规则,有许多数值计算变得更加简单.例如,考虑表达式:

a = 1 /(1/b + 1/c)

这种表达产生于电阻器和透镜.如果被零除导致程序崩溃(在IEEE浮点之前的许多系统中都是如此),则需要两个if语句来检查b或c的小值或零值.相反,对于IEEE浮点数,如果b或c为零,我们将根据需要获得零值.

但有关情况什么b=+0c=-0?然后a=1/inf-inf=nan.这本书的优化是错误的,还是我误解了什么?似乎我们仍然需要至少一次检查b&c的迹象,而不是根本没有检查.

编辑 评论中的一条建议就是对NaN进行后检查.这是"利用"这些数字类型的惯用方式吗?

bool is_nan(float x) { return x != x; }

float optic_thing(float b, float c) {
  float result = 1.0f / (1.0f/b + 1.0f/c);
  if (is_nan(result)) result = 0;
  return result;
}
Run Code Online (Sandbox Code Playgroud)

c ieee-754

5
推荐指数
1
解决办法
85
查看次数

标签 统计

c ×1

ieee-754 ×1