意外输出 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,最接近 1000000000000000001double1000000000000000000,这很可能是您的结果。

(long long)pow(10, 18) + 1

可能有效(并且可能会使用现代 C 工具集):你仍然受制于 pow return 代数正确的结果,虽然它是越来越流行认为 pow 的 C 实现不是 return 在给定整数参数时可能的最佳结果是有缺陷的 - pow(x, y) 的日子被简单地实现为 exp(y * log(x)) 确定结束了吗?

真的有两个选择。要么希望你所有的目标平台都能满足它,要么使用具有整数参数幂函数的数学库,使用诸如 exponentation by squaring.

之类的技术