使用大文字初始化浮点变量

Nik*_*pov 5 c floating-point

#include <stdio.h>

int main(void) {
    double x = 0.12345678901234567890123456789;
    printf("%0.16f\n", x);
    return 0;
};
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我x用文字初始化太大而不能用IEEE 754双精度表示.在我的PC上使用gcc 4.9.2它运行良好.文字四舍五入到最接近double的值.我想知道在这种情况下幕后发生了什么(在编译器级别)?这种行为取决于平台吗?这合法吗?

Pas*_*uoq 6

写入时double x = 0.1;,您编写的十进制数将四舍五入为最接近的数字double.那么当你写作时发生的事情0.12345678901234567890123456789并没有根本不同.

该行为基本上是实现定义的,但大多数编译器将使用最近的可表示double来代替常量.C标准规定它必须是double紧接在上面或紧接在下面的那个.