我想这是一个相当基本的问题,但我不知道为什么这两个代码给出不同的结果。 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++生成器,其给出作为生成器相同的结果6.我使用的默认编译器设置。
一些编译器保证他们总是将x和y的计算编译为等效的指令。有些编译器保证它们不会生成相同的指令,因为将'double'类型的中间计算分配给'double'左值具有影响。有些编译器甚至不知道有什么区别。如果没有关于编译器的信息,很难说更多,但查找'FLT_EVAL_METHOD'(在C99中引入)以获取更多信息。 –