C 和无穷大算术

问题描述 投票:0回答:1
#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

我想知道我的逻辑哪里出了问题。

c math ieee-754 infinity
1个回答
0
投票

您似乎有的错误假设是

(double) INFINITY - 3.5e308
会导致正无穷大。

由于

3.5e308
超出了
double
的范围,因此它是浮点无穷大。 GCC 和 Clang 都没有添加编译器标志,都会提供警告,表明这两个大值对于类型来说太大了
double

结果就是有效的:

double a = (double) 0 + (double) INFINITY - (double) INFINITY;

没关系,从数值上看,3.5e308 比 5e308 小。两者都是双精度无穷大。

无穷大减去无穷大被定义为 NaN。

© www.soinside.com 2019 - 2024. All rights reserved.