gpt4 book ai didi

c - 为什么这 2 段简单的代码会给出不同的结果?

转载 作者:太空宇宙 更新时间:2023-11-03 23:29:47 24 4
gpt4 key购买 nike

我想这是一个相当基本的问题,但我不知道为什么这两段代码会给出不同的结果。 Pentium 处理变量 Divider 的方式是否不同于中间值 ( 256.0/(double)k )?

int j=64, k=20;  
double x, y, Divider;

Divider = 256.0 / (double)k;
x = (double)j / Divider - 5.0;
y = (double)j / ( 256.0 / (double)k ) - 5.0;

结果: x = -2.77555756156289E-16 y = 0.0

作为引用,我使用的是 Embarcadero 的 XE3 C++ Builder,它给出的结果与 Builder 6 相同。我在两者上都使用了默认的编译器设置。

最佳答案

问题是,当您不使用 SSE 指令时,编译器很可能会选择使用 native 387 浮点单元进行中间计算,该单元使用 80 位值进行所有计算。

x 的计算中,您通过将中间值存储在 Divisor 中强制将其截断为 64 位。然后下一个除法使用一个已经四舍五入的除数;由于除法精度足够,结果与 5.0 略有不同。

y 的计算中,除法以 80 位精度完成,因此结果更接近 5.0(足够接近以至于截断为 64 位使其为 0)。

如果您使用 SSE(它只有 64 位寄存器),您还会得到两个 0 值,或者强制编译器以 64 位精度进行所有计算。

关于c - 为什么这 2 段简单的代码会给出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18639282/

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