[問題] 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