意外输出 math.h
Unexpected output math.h
有人知道为什么这段代码打印 1000000000000000000
而不是预期的 1000000000000000001
吗?
#include <stdio.h>
#include <math.h>
int main(void){
long long n = (pow(10,18) + 1);
printf("%lld ", n);
}
pow(10, 18)
return 是一个浮点数 double
。其结果加上 1,在浮点 space 中与您返回的数字无法区分。对于 IEEE754,最接近 1000000000000000001
的 double
是 1000000000000000000
,这很可能是您的结果。
(long long)pow(10, 18) + 1
可能有效(并且可能会使用现代 C 工具集):你仍然受制于 pow
return 代数正确的结果,虽然它是越来越流行认为 pow
的 C 实现不是 return 在给定整数参数时可能的最佳结果是有缺陷的 - pow(x, y)
的日子被简单地实现为 exp(y * log(x))
确定结束了吗?
真的有两个选择。要么希望你所有的目标平台都能满足它,要么使用具有整数参数幂函数的数学库,使用诸如 exponentation by squaring.
之类的技术
有人知道为什么这段代码打印 1000000000000000000
而不是预期的 1000000000000000001
吗?
#include <stdio.h>
#include <math.h>
int main(void){
long long n = (pow(10,18) + 1);
printf("%lld ", n);
}
pow(10, 18)
return 是一个浮点数 double
。其结果加上 1,在浮点 space 中与您返回的数字无法区分。对于 IEEE754,最接近 1000000000000000001
的 double
是 1000000000000000000
,这很可能是您的结果。
(long long)pow(10, 18) + 1
可能有效(并且可能会使用现代 C 工具集):你仍然受制于 pow
return 代数正确的结果,虽然它是越来越流行认为 pow
的 C 实现不是 return 在给定整数参数时可能的最佳结果是有缺陷的 - pow(x, y)
的日子被简单地实现为 exp(y * log(x))
确定结束了吗?
真的有两个选择。要么希望你所有的目标平台都能满足它,要么使用具有整数参数幂函数的数学库,使用诸如 exponentation by squaring.
之类的技术