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