使用大数时,函数 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()
整数的输出是精确的,而浮点值则不然。
请解释为什么 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
可能有
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()
整数的输出是精确的,而浮点值则不然。