gpt4 book ai didi

c - mingw32 中的 Double 到 int 隐式转换

转载 作者:太空狗 更新时间:2023-10-29 16:28:49 24 4
gpt4 key购买 nike

我无法解释以下程序的行为(在 mingw 32 位上用 gcc 编译)。我知道从 double 隐式转换为 int 时可能会出现精度损失,但我希望这两种情况会提供相同的输出,因为它们执行完全相同的操作。为什么两个输出不同?

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

int main()
{
int table[3] = {2, 3, 4};
int i, N;

N = 0;
N += table[0] * pow(100, 0);
N += table[1] * pow(100, 1);
N += table[2] * pow(100, 2);
printf("%d\n", N);

N = 0;
for(i = 0; i < 3; i++)
N += table[i] * pow(100, i);
printf("%d\n", N);

return 0;
}

//output:
40302
40300

最佳答案

使用 pow(100, 0) pow(100, 1)pow(100, 2) 编译器替换函数调用使用常量 (1, 100, 10000),但使用 pow(100, i) 它必须在运行时实际调用函数(因为变量 i 作为参数传递),导致 pow 的两个结果,格式为 0.9999999999.999999 而不是 1100(或 3 个中的任意 2 个)。在乘法后截断为 int 时,您会“丢失”两个单位。

这是为什么从 double 转换为 int 只是纯粹的邪恶的另一个例子:很难在你的程序中找到细微的错误(不是编译器错误)。

顺便说一句,令我惊讶的是,带有 O2 的编译器没有展开循环、传播常量并达到相同的优化(用常量结果替换函数调用)。

Btw2 从头开始​​,令我惊讶的是,编译器并没有仅通过两次调用 printf 来替换您的所有代码。

关于c - mingw32 中的 Double 到 int 隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27345080/

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