作者tstanly ()
看板C_and_CPP
标题[问题] double的问题
时间Wed Feb 22 16:52:38 2023
大家好
想请教一个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表示的关系
谢谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.161.39.15 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1677055960.A.7DE.html
※ 编辑: tstanly (118.161.39.15 台湾), 02/22/2023 16:56:44
1F:推 yvb: 你还没 printf 前就都转成整数了不是吗? 02/22 18:03
2F:→ yvb: 另外实测 32-bit -O0 两个尾数都会是 49 . 02/22 18:03
3F:→ yvb: 但是 32-bit -O1 或 64-bit 的结果, 尾数就是 50 和 49. 02/22 18:06
4F:→ nh60211as: 两个数字都无法完整用double来表示 02/22 19:58
7F:→ nh60211as: 另外浮点数运算在不同的架构、编译器、编译选项都可能 02/22 19:58
8F:→ nh60211as: 有不同的结果 02/22 19:58
10F:→ nh60211as: 可以参考上面都是GCC开不同编译选项,实际产生的code 02/22 19:59
11F:→ nh60211as: 完全不一样 02/22 19:59
12F:→ tstanly: 谢谢。从assembly code看起来 326049是compiler先算的(爲 02/23 16:39
13F:→ tstanly: 了optimization)。只是不懂爲什麽它这样算了。 02/23 16:39
14F:→ nh60211as: 因为你的程式码只有可能产生一种输出,如果你把这段逻 02/23 17:38
15F:→ nh60211as: 辑写成一个function的话那编译器就不可能先把输出写到 02/23 17:38
16F:→ nh60211as: 程式里面了 02/23 17:38
17F:推 LPH66: 之所以这里会有这种差就是取整时是截断取整而非最接近取整 02/24 18:27
18F:→ LPH66: 那这一点如上所述跟不同架构不同编译器不同编译选项都有关 02/24 18:27
19F:推 hellophoenix: 用double d=3.326950000000000l看看 03/08 23:10
20F:→ hellophoenix: 感觉宣告d的时候是把0.32605的float给了d所以造成 03/08 23:12
21F:→ hellophoenix: 精度损失 03/08 23:12
22F:→ yvb: 楼上请看一下五楼和六楼的图片吧. 03/08 23:44