相关疑难解决方法(0)

为什么在float文字的末尾添加0会改变它的轮次(可能是GCC错误)?

我在x86 VM(32位)上发现了以下程序:

#include <stdio.h>
void foo (long double x) {
    int y = x;
    printf("(int)%Lf = %d\n", x, y);
}
int main () {
    foo(.9999999999999999999728949456878623891498136799780L);
    foo(.999999999999999999972894945687862389149813679978L);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

(int)1.000000 = 1
(int)1.000000 = 0
Run Code Online (Sandbox Code Playgroud)

Ideone也会产生这种行为.

编译器做了什么来允许这种情况发生?

我发现这个不变,因为我正在追踪为什么下面的程序没有0按照我的预期产生(使用19 9秒产生0我预期的):

int main () {
    long double x = .99999999999999999999L; /* 20 9's */
    int y = x;
    printf("%d\n", y);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我试图计算结果从预期切换到意外时的值时,我得出了这个问题的常数.

c c++ floating-point gcc

25
推荐指数
2
解决办法
1814
查看次数

标签 统计

c ×1

c++ ×1

floating-point ×1

gcc ×1