[問題] int與float的問題
開發平台(Platform): (Ex: Win10, Linux, ...)
Linux
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC
問題(Question):
最近看到的題目
關於int與float的轉換問題
已知int為整數型態,float為浮點數,資料轉換會有遺失風險
宣告int放入16進位 0x7FFFFFFF
也就是10進位的2147483647
放入float型態後數值會+1
可是根據我對IEEE754的解釋
算出來的應該會是 2147483520 才對
另外一個疑問是
為什麼在main function
從float傳入到int變回 2147483647
但是pass by value傳入到function後
放入int型態和回傳都會是-2147483648
目前有從float浮點數運算,return架構去考量,但還是想不出原因
所以想要請教各位大大們
底下有完整程式碼及輸出可以參考
感激不盡
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
https://ideone.com/VXE1Hl
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 219.68.122.68
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1548772501.A.89D.html
※ 編輯: andy15281528 (219.68.122.68), 01/29/2019 22:37:55
※ 編輯: andy15281528 (219.68.122.68), 01/29/2019 22:43:03
推
01/29 22:44,
6年前
, 1F
01/29 22:44, 1F
對,不小心打錯了,他的最高就是2的32次方-1
→
01/29 22:49,
6年前
, 2F
01/29 22:49, 2F
※ 編輯: andy15281528 (219.68.122.68), 01/29/2019 23:21:32
推
01/29 23:31,
6年前
, 3F
01/29 23:31, 3F
推
01/30 00:30,
6年前
, 4F
01/30 00:30, 4F
→
01/30 00:32,
6年前
, 5F
01/30 00:32, 5F
→
01/30 00:33,
6年前
, 6F
01/30 00:33, 6F
如果是這樣解釋,那我大概了解了,先謝謝你的回答
不過float浮點數正規化後不是只能存23個小數點嗎,但是int換成2進位後會有30個小數
點,這樣不是有7個會遺失嗎,還是我哪裡理解錯誤了呢
※ 編輯: andy15281528 (219.68.122.68), 01/30/2019 01:09:42
推
01/30 01:19,
6年前
, 7F
01/30 01:19, 7F
→
01/30 01:20,
6年前
, 8F
01/30 01:20, 8F
→
01/30 01:21,
6年前
, 9F
01/30 01:21, 9F
→
01/30 01:21,
6年前
, 10F
01/30 01:21, 10F
→
01/30 01:22,
6年前
, 11F
01/30 01:22, 11F
原來如此!!!有如醍醐灌頂阿!!!真的是太感謝你了,解決我這幾天的疑惑
※ 編輯: andy15281528 (219.68.122.68), 01/30/2019 02:35:35
※ 編輯: andy15281528 (219.68.122.68), 01/30/2019 02:36:57
推
01/30 08:01,
6年前
, 12F
01/30 08:01, 12F
→
01/30 08:02,
6年前
, 13F
01/30 08:02, 13F
→
01/30 08:41,
6年前
, 14F
01/30 08:41, 14F
→
01/30 08:48,
6年前
, 15F
01/30 08:48, 15F
實際上不會亂用,只是題目剛好這樣出
→
01/30 09:00,
6年前
, 16F
01/30 09:00, 16F
我來多測試看看
推
01/30 09:31,
6年前
, 17F
01/30 09:31, 17F
→
01/30 09:32,
6年前
, 18F
01/30 09:32, 18F
我也有在某個地方看到說 如果近似值非常接近的話,先優先選擇偶數呈現
※ 編輯: andy15281528 (223.136.153.40), 01/30/2019 12:29:00
剛剛做了一些小測試,發現有一個明顯的分水嶺在於 7fffffbf+1後,程式碼如下,更一
頭霧水了
https://ideone.com/bxwsyg
※ 編輯: andy15281528 (223.136.153.40), 01/30/2019 13:42:51
剛剛把他們轉換成2進位利用浮點數運算之後,突然清晰了起來
原本7FFFFFBF的二進位尾數是0111111,捨去第一位為0所以沒進位
+1之後變成1000000,就像是L大所說的開始進位了,由於前面也都是1所以直接爆掉變成8
0000000,傳回int才會變成負數。
※ 編輯: andy15281528 (223.136.153.40), 01/30/2019 14:06:52
推
01/30 15:31,
6年前
, 19F
01/30 15:31, 19F
→
01/30 15:32,
6年前
, 20F
01/30 15:32, 20F