使用大数时,函数 pow() 不能正常工作?

Function pow() does not work correctly when using big numbers?

请解释为什么 pow() 对 2^63 这样的大数不起作用?(如果你用 pow(long long int a, long long int b) 的原型而不是 pow(double a, double b) 写一个 pow 函数它就可以工作很好。)

代码如下:

#include <stdio.h>
#include <math.h>
int main()
{
    printf("%.0lf\n" ,pow((double)2,63));
}

输出:

9223372036854775800

正确答案:

9223372036854775808

谢谢。

pow 工作正常。 MSVC 的 printf 存在错误并会截断浮点输出。

printf("%.0lf\n", x); 不需要打印 (double) x.

精确

兼容的 C compiler/standard C 库将生成打印大约 DBL_DECIMAL_DIG(通常为 17)的代码,正确的 significant 十进制数字。其他可能会正确打印更多数字。 (我打印的 9223372036854775808)。参见 <float.h>

// 45678901234567
9223372036854775800 // answer
9223372036854775808 // true answer:

极端例子

DBL_MAX 可能有

exact value
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

然而 printf("%.0lf\n" ,DBL_MAX); 的许多结果在某个点后会报告零

179769313486231570814527423731704356798070600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

OP 参考 pow() 函数是 long long int pow(long long int a, long long int b)pow_ll_version(2,63) 预计会导致 9223372036854775808,这是 1 传递了许多 LLONG_MAX - 当然是未定义的行为。让我们假设它 wrapped-9223372036854775808,并用 printf("%llu\n" , long_long_int_result); 打印(更多 UB 作为不匹配的说明符和类型)。这可能给了 OP 9223372036854775808

printf() 整数的输出是精确的,而浮点值则不然。