看板 Fortran 關於我們 聯絡資訊
一個double precision的運算式中print出來的值是-119.000000000000 但若取int卻print出現-118,這當中出現了什麼問題呢? 程式碼大約如下: double precision x,y . . . . . . . . print*,(x-y)*10.0d+00, int((x-y)*10.0d+00) 結果: -115.000000000000 -115 -116.000000000000 -116 -117.000000000000 -117 -118.000000000000 -118 -119.000000000000 -118 恩...我無言了...= ='' -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 115.43.222.152 ※ 文章網址: https://www.ptt.cc/bbs/Fortran/M.1442169276.A.9A3.html
onezillion: int只取整數部分,無視小數點進位? 09/14 09:56
kerwinhui: 如果要四捨五入請先加 sgn*0.5D0 09/14 10:58
kerwinhui: 如果你是用gfortran可以用nint,ifort的話不建議使用 09/14 11:02
rex0707: INT 是無條件捨去 09/14 13:22
blc: 就 -119.00 其實是 -118.9999999~ 我猜x,y值都滿大的, 09/14 13:42
blc: 相減之後的差值有碰到有效位數的問題。 09/14 13:42
ttjhninn: 可是print出來的數不會就是他算出來的數字嗎? 09/14 13:44
ttjhninn: 他print出來的數字的確是-119.0000000....啊 09/14 13:46
blc: print出來的是會四捨五入的(印象中) 09/14 13:56
ttjhninn: 那有辦法可以看到實際計算出來的直嗎? 09/14 14:02
rex0707: 格式化輸出吧 09/14 14:04
ttjhninn: 以多加write(17,*)(x-y)*10.0d+00,int((x-y)*10.0d+00) 09/14 14:13
ttjhninn: 得到的數字仍然是-119.000000000000 -118 09/14 14:13
blc: 用unformatted寫到檔案裡,然後用hexdump看。 09/14 14:15
blc: 問一下,你是用ifort嗎? 09/14 14:15
blc: 然後xy各是多少? 09/14 14:16
ttjhninn: 應該是ifor沒錯 09/14 14:18
blc: 比較一下unformatted的(x-y)跟119.有沒有不一樣。 09/14 14:26
blc: 或是換gfortran試試會不會有問題。 09/14 14:27
ttjhninn: 改成int(x*10.0d+00-y*10.0d+00)數字就變-119了,why!? 09/14 22:02