为什么在double的情况下,结果等于2.而在float的情况下,结果等于3.
我想要个具体的解释,而不是简简单单的一句精度的问题。麻烦各位大佬。
当你思考这个问题的时候,证明你是一个优秀的学生,只有这样你才能真正学到东西,探索未知。
好回归正题,但对于这块,我不太建议你搞懂,因为是浮点数编码标准导致有精度问题。别看只是定义的变量类型不一样,它们的处理方式不一样的。如果你硬想要个解释,首先你得具备如下知识点:
如果你学过或者有积淀的话,我就给你解释解释。
有关浮点数的编码,请搜索 IEEE 754 标准。如果你弄明白编码方式了,你就明白为什么会有精度损失问题。
在汇编层面,对于以上的代码,会有不同的处理方式:
如果生成完毕,汇编代码如下:
double a, b;
int d;
a = 3.3;
00401069 movsd xmm0,mmword ptr [__real@400a666666666666 (0403128h)]
00401071 movsd mmword ptr [a],xmm0
b = 1.1;
00401076 movsd xmm0,mmword ptr [__real@3ff199999999999a (0403120h)]
0040107E movsd mmword ptr [b],xmm0
d = a / b;
00401083 movsd xmm0,mmword ptr [a]
00401088 divsd xmm0,mmword ptr [b]
0040108D cvttsd2si eax,xmm0
00401091 mov dword ptr [d],eax
float a, b;
int d;
a = 3.3;
00401069 movss xmm0,dword ptr [__real@40533333 (0403124h)]
00401071 movss dword ptr [a],xmm0
b = 1.1;
00401076 movss xmm0,dword ptr [__real@3f8ccccd (0403120h)]
0040107E movss dword ptr [b],xmm0
d = a / b;
00401083 movss xmm0,dword ptr [a]
00401088 divss xmm0,dword ptr [b]
0040108D cvttss2si eax,xmm0
00401091 mov dword ptr [d],eax
从汇编代码层面,虽然代码仅仅只有声明的区别,但是汇编指令用的是不一样的,一个是movsd
,另一个是movss
。它们的功能请自行查阅白皮书。
看到最后,看似我啥都解释了,又似乎啥也没解释,感觉我废话乱篇。这一切的一切都是来源于我没把这个标准咋编码的解释明白,但这超出我的知识范畴了,抱歉我已经帮不上忙了,因为在我学习的领域,我不会亲自处理浮点数,所以有关底层的详细细节,请自行探索。
非常感谢你为我解答,虽然我现在刚刚大一才学c,但是等我后面学了汇编等计算机底层原理后,我相信我会看懂。对于IEE754浮点数转换二进制的计算方法我之前了解过,也动手尝试计算过。