#include <stdio.h>
int main(void) {
double x = 0.12345678901234567890123456789;
printf("%0.16f\n", x);
return 0;
};
在上面的代码中,我用文字初始化x
,文字太大而无法用IEEE 754双精度表示。在我的PC上使用gcc 4.9.2它运行良好。文字四舍五入到最接近double的值。我想知道在这种情况下幕后(在编译器级别)会发生什么?这种行为取决于平台吗?这是合法的吗?
答案 0 :(得分:6)
当你写double x = 0.1;
时,你写的十进制数将四舍五入到最接近的double
。那么当你写0.12345678901234567890123456789
时发生的事情并没有根本不同。
行为本质上是实现定义的,但大多数编译器将使用最近的可表示double
来代替常量。 C标准specifies必须是紧邻上方的double
或紧接下方的free
。