[问题] double的问题

楼主: tstanly   2023-02-22 16:52:38
大家好
想请教一个double的问题
double d = 2.32605000;
uint32_t i = 2;
double m = d - i;
uint32_t x = d * 1000000;
uint32_t y = m * 1000000;
printf("x=%d, y=%d", x, y);
印出来x是2326050没问题
但y却是326049
这是print的precision问题吗? 或是因为double的binary表示的关系
谢谢!
作者: yvb   2023-02-22 18:03:00
你还没 printf 前就都转成整数了不是吗?另外实测 32-bit -O0 两个尾数都会是 49 .但是 32-bit -O1 或 64-bit 的结果, 尾数就是 50 和 49.
作者: nh60211as   2023-02-22 19:58:00
两个数字都无法完整用double来表示https://i.imgur.com/j69EN6Y.pnghttps://i.imgur.com/UwKCwAP.png另外浮点数运算在不同的架构、编译器、编译选项都可能有不同的结果https://godbolt.org/z/1P5zzhEKz可以参考上面都是GCC开不同编译选项,实际产生的code完全不一样
楼主: tstanly   2023-02-23 16:39:00
谢谢。从assembly code看起来 326049是compiler先算的(为了optimization)。只是不懂为什么它这样算了。
作者: nh60211as   2023-02-23 17:38:00
因为你的程式码只有可能产生一种输出,如果你把这段逻辑写成一个function的话那编译器就不可能先把输出写到程式里面了
作者: LPH66 (-6.2598534e+18f)   2023-02-24 18:27:00
之所以这里会有这种差就是取整时是截断取整而非最接近取整那这一点如上所述跟不同架构不同编译器不同编译选项都有关
作者: hellophoenix (Rainey)   2023-03-08 23:10:00
用double d=3.326950000000000l看看感觉宣告d的时候是把0.32605的float给了d所以造成精度损失
作者: yvb   2023-03-08 23:44:00
楼上请看一下五楼和六楼的图片吧.

Links booklink

Contact Us: admin [ a t ] ucptt.com