[問題] double的問題

看板C_and_CPP (C/C++)作者時間1年前 (2023/02/22 16:52), 1年前編輯推噓2(2016)
留言18則, 4人參與, 1年前最新討論串1/1
大家好 想請教一個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://www.ptt.cc/bbs/C_and_CPP/M.1677055960.A.7DE.html ※ 編輯: tstanly (118.161.39.15 臺灣), 02/22/2023 16:56:44

02/22 18:03, 1年前 , 1F
你還沒 printf 前就都轉成整數了不是嗎?
02/22 18:03, 1F

02/22 18:03, 1年前 , 2F
另外實測 32-bit -O0 兩個尾數都會是 49 .
02/22 18:03, 2F

02/22 18:06, 1年前 , 3F
但是 32-bit -O1 或 64-bit 的結果, 尾數就是 50 和 49.
02/22 18:06, 3F

02/22 19:58, 1年前 , 4F
兩個數字都無法完整用double來表示
02/22 19:58, 4F

02/22 19:58, 1年前 , 5F

02/22 19:58, 1年前 , 6F

02/22 19:58, 1年前 , 7F
另外浮點數運算在不同的架構、編譯器、編譯選項都可能
02/22 19:58, 7F

02/22 19:58, 1年前 , 8F
有不同的結果
02/22 19:58, 8F

02/22 19:59, 1年前 , 9F

02/22 19:59, 1年前 , 10F
可以參考上面都是GCC開不同編譯選項,實際產生的code
02/22 19:59, 10F

02/22 19:59, 1年前 , 11F
完全不一樣
02/22 19:59, 11F

02/23 16:39, 1年前 , 12F
謝謝。從assembly code看起來 326049是compiler先算的(爲
02/23 16:39, 12F

02/23 16:39, 1年前 , 13F
了optimization)。只是不懂爲什麼它這樣算了。
02/23 16:39, 13F

02/23 17:38, 1年前 , 14F
因為你的程式碼只有可能產生一種輸出,如果你把這段邏
02/23 17:38, 14F

02/23 17:38, 1年前 , 15F
輯寫成一個function的話那編譯器就不可能先把輸出寫到
02/23 17:38, 15F

02/23 17:38, 1年前 , 16F
程式裡面了
02/23 17:38, 16F

02/24 18:27, 1年前 , 17F
之所以這裡會有這種差就是取整時是截斷取整而非最接近取整
02/24 18:27, 17F

02/24 18:27, 1年前 , 18F
那這一點如上所述跟不同架構不同編譯器不同編譯選項都有關
02/24 18:27, 18F
文章代碼(AID): #1ZzTVOVU (C_and_CPP)
文章代碼(AID): #1ZzTVOVU (C_and_CPP)