PTT
Submit
Submit
选择语言
正體中文
简体中文
PTT
C_and_CPP
[问题] 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.png
https://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
楼上请看一下五楼和六楼的图片吧.
继续阅读
[问题] 如何只特化参数类别的其中一个函式
alan23273850
[问题] 如何将整个阵列的资料进行位移?
handofn0xus
[问题] 呼叫字串阵列并输出
devcc
[问题] spinlock问题
gn00618777
[问题] std::thread+functor
Keitaro
[问题] callback function如何 try catch?
soufon
[问题]循环下 syntax error问题
RichieRich
[问题] 询问 C 语言的问题 & 学习资源请教
allencheng
Re: [问题] big endian中bit field 的问题
descent
[问题] big endian中bit field 的问题
ca5270
Links
booklink
Contact Us: admin [ a t ] ucptt.com