【发布时间】:2013-06-27 16:08:18
【问题描述】:
这是 clang 的错误吗?
这会打印出最大的双精度值:
long double a = DBL_MAX;
printf("%Lf\n", a);
它是:
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 P>
这会打印出最大的 long double 值:
long double a = LDBL_MAX;
printf("%Lf\n", a);
它是:
/* … bigger, but not displayed here. For a good reason. ;-) */
这很清楚。
但是当我使用算术表达式,即编译时可计算的初始化器时,我得到了一个令人惊讶的结果:
long double a = 1.L + DBL_MAX + 1.L;
printf("%Lf\n", a);
这仍然打印出 DBL_MAX 而不是 DBL_MAX + 2!?
如果在运行时进行计算也是一样的:
long double b = 2.L;
long double a = DBL_MAX;
printf("%Lf\n", a+b);
还是 DBL_MAX。
$ clang --version
Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.4.0
Thread model: posix
【问题讨论】:
-
前16位左右后,余数无意义;
double类型根本不再存储任何数字。