作者查詢 / phterry
作者 phterry 在 PTT [ C_and_CPP ] 看板的留言(推文), 共52則
限定看板:C_and_CPP
看板排序:
7F推:浮點數->整數也有可能發生誤差的情形,請看下例:09/17 11:32
8F→:float x = 1.801; int y = (int)(x * 1000.0);09/17 11:32
9F→:這樣在 x86 上, y的結果會變成1800,而不是180109/17 11:33
10F→:但是在其他的processer,就能得到正確的180109/17 11:34
12F推:這不單純是乘法的誤差,可以看看下例:09/17 11:57
13F→:int y = (int)(1.801 * 1000.0);09/17 11:58
14F→:以及 float x = 1.801; int y; x *= 1000.0; y = (int)x;09/17 11:59
15F→:以上這兩例都可以在x86上取得正確的180109/17 11:59
22F推:不知道你有沒有親身驗證過這個問題... 上述的code你可以改09/17 12:54
23F→:成double試看看,結果我就不說明了.09/17 12:55
25F→:float改成double後,結果有什麼差異否?09/17 13:00
28F→:1801是哪一段啊?09/17 13:05
29F→:我實在不想和你戰,覺得沒什麼意義,我只不過想提醒大家可能09/17 13:07
30F→:會被乎略的錯誤而已. x86 的浮點有一些特性會產生和其他09/17 13:08
31F→:CPU不同的結果,如此而已.09/17 13:10
35F→:其實我不是很懂我說的這個跟你說的有什麼關係耶...09/17 13:16
36F→:或許你用你的想法解釋為何會有1800的結果會比較理想09/17 13:17
41F推:double x; int y = (int)(x * 1000.0); 請問你的結果?09/17 13:19
44F推:不好意思,我剛x忘了給初值,應該要double x = 1.801;09/17 13:22
45F→:我用x86 32bit Linux執行的結果是180009/17 13:23
46F→:在ARM Linux上跑,結果卻是1801,而1801也是我們所希望的09/17 13:23
49F→:再來 float x = 1.801; int y = (int)(x * 1000.0f);09/17 13:26
50F→:上面這樣寫,x86 -> 1800, ARM->180109/17 13:26
52F→:你的意思是compiler還是CPU?09/17 13:32
56F→:那原先的double->float四捨五入之說應該....09/17 13:34
58F→:有一篇文章是一個日本人寫的,可能有點久了,我暫時找不到09/17 13:36
59F→:大意是說x86的浮點有一個擴張精度,會讓指數部份變成15bit09/17 13:37
60F→:而不是一般所認知的11bit09/17 13:37
1F→:我比較想知道,你delete了後,還期待它會印出什麼?08/25 16:56
8F推:這樣做,系統會配置一塊記憶體裡存這個字串,但是正如樓上06/13 23:57
9F→:所述,是一個const,所以只能讀不能寫,如果你做以下的事06/13 23:58
10F→:*ch1 = 'G'; /* 試著把第一個字元變大寫 */06/13 23:58
11F→:或許可以編譯,但執行時一定會發生記憶體錯誤06/13 23:59