首页 新闻 会员 周边 捐助

在c中double转int的问题

1
悬赏园豆:20 [已解决问题] 解决于 2022-02-25 17:46

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

Eason小白的主页 Eason小白 | 初学一级 | 园豆:100
提问于:2022-02-25 16:43
< >
分享
最佳答案
1

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

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

  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。它们的功能请自行查阅白皮书。
看到最后,看似我啥都解释了,又似乎啥也没解释,感觉我废话乱篇。这一切的一切都是来源于我没把这个标准咋编码的解释明白,但这超出我的知识范畴了,抱歉我已经帮不上忙了,因为在我学习的领域,我不会亲自处理浮点数,所以有关底层的详细细节,请自行探索。

收获园豆:20
寂静的羽夏 | 老鸟四级 |园豆:2133 | 2022-02-25 17:37

非常感谢你为我解答,虽然我现在刚刚大一才学c,但是等我后面学了汇编等计算机底层原理后,我相信我会看懂。对于IEE754浮点数转换二进制的计算方法我之前了解过,也动手尝试计算过。

Eason小白 | 园豆:100 (初学一级) | 2022-02-25 17:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册