gpt4 book ai didi

c++ - 调用 pow() 时舍入结果的差异

转载 作者:搜寻专家 更新时间:2023-10-31 01:09:24 25 4
gpt4 key购买 nike

好的,我知道有很多关于 pow 函数并将其结果转换为 int 的问题,但我找不到这个有点具体的问题的答案。

好的,这是 C 代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
int i = 5;
int j = 2;

double d1 = pow(i,j);
double d2 = pow(5,2);
int i1 = (int)d1;
int i2 = (int)d2;
int i3 = (int)pow(i,j);
int i4 = (int)pow(5,2);

printf("%d %d %d %d",i1,i2,i3,i4);

return 0;
}

这是输出:“25 25 24 25”。请注意,只有在 pow 的参数不是文字的第三种情况下,我们才会得到错误的结果,这可能是由舍入错误引起的。同样的事情发生在没有显式转换的情况下。有人可以解释这四种情况下会发生什么吗?

我在 Windows 7 中使用 CodeBlocks,以及它附带的 MinGW gcc 编译器。

最佳答案

pow 运算的结果是 25.0000 加上或减去一些舍入误差。如果舍入误差为正或零,则转换为整数后将产生 25。如果舍入误差为负,则结果为 24。两个答案都是正确的。

内部最有可能发生的情况是,在一种情况下直接使用更高精度的 80 位 FPU 值,而在另一种情况下,结果从 FPU 写入内存(作为 64 位double) 然后读回(将其转换为略有不同的 80 位值)。这会对最终结果产生微观差异,这就是将 25.0000000001 更改为 24.999999997 所需的一切

另一种可能性是您的编译器识别传递给 pow 的常量并自行进行计算,将结果替换为对 pow 的调用。您的编译器可能使用内部任意精度数学库,也可能只使用一个不同的数学库。

关于c++ - 调用 pow() 时舍入结果的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17063102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com