在c中double转int的问题

为什么在double的情况下,结果等于2.而在float的情况下,结果等于3.
我想要个具体的解释,而不是简简单单的一句精度的问题。麻烦各位大佬。

回答

当你思考这个问题的时候,证明你是一个优秀的学生,只有这样你才能真正学到东西,探索未知。

好回归正题,但对于这块,我不太建议你搞懂,因为是浮点数编码标准导致有精度问题。别看只是定义的变量类型不一样,它们的处理方式不一样的。如果你硬想要个解释,首先你得具备如下知识点:

  1. 汇编(要会浮点FPU指令)
  2. 编码的知识

如果你学过或者有积淀的话,我就给你解释解释。
有关浮点数的编码,请搜索 IEEE 754 标准。如果你弄明白编码方式了,你就明白为什么会有精度损失问题。
在汇编层面,对于以上的代码,会有不同的处理方式:

对于 double

如果生成完毕,汇编代码如下:

    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

    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中double转int的问题的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>