#include <math.h>
void main() {
double a = 0;
a += 5e308;
a -= 3.5e308;
if (a == INFINITY) {
printf("1 %e\n", a);
}
else
printf("0 %e\n", a);
}
这里,第一条打印行是我所期望的,但是为什么执行第二条打印语句? 我认为
a
应该是正无穷大,因为无穷大 -3.5e308 应该是正无穷大,就在第 4 行?
我已经尝试执行它,但输出是:
0 -1.#IND00e+000
我想知道我的逻辑哪里出了问题。
您似乎有的错误假设是
(double) INFINITY - 3.5e308
会导致正无穷大。
由于
3.5e308
超出了double
的范围,因此它是浮点无穷大。 GCC 和 Clang 都没有添加编译器标志,都会提供警告,表明这两个大值对于类型来说太大了double
。
结果就是有效的:
double a = (double) 0 + (double) INFINITY - (double) INFINITY;
没关系,从数值上看,3.5e308 比 5e308 小。两者都是双精度无穷大。
无穷大减去无穷大被定义为 NaN。