[問題] int計算錯誤

看板Fortran作者 (Cream)時間8年前 (2015/09/14 02:34), 編輯推噓0(0020)
留言20則, 5人參與, 最新討論串1/1
一個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

09/14 09:56, , 1F
int只取整數部分,無視小數點進位?
09/14 09:56, 1F

09/14 10:58, , 2F
如果要四捨五入請先加 sgn*0.5D0
09/14 10:58, 2F

09/14 11:02, , 3F
如果你是用gfortran可以用nint,ifort的話不建議使用
09/14 11:02, 3F

09/14 13:22, , 4F
INT 是無條件捨去
09/14 13:22, 4F

09/14 13:42, , 5F
就 -119.00 其實是 -118.9999999~ 我猜x,y值都滿大的,
09/14 13:42, 5F

09/14 13:42, , 6F
相減之後的差值有碰到有效位數的問題。
09/14 13:42, 6F

09/14 13:44, , 7F
可是print出來的數不會就是他算出來的數字嗎?
09/14 13:44, 7F

09/14 13:46, , 8F
他print出來的數字的確是-119.0000000....啊
09/14 13:46, 8F

09/14 13:56, , 9F
print出來的是會四捨五入的(印象中)
09/14 13:56, 9F

09/14 14:02, , 10F
那有辦法可以看到實際計算出來的直嗎?
09/14 14:02, 10F

09/14 14:04, , 11F
格式化輸出吧
09/14 14:04, 11F

09/14 14:13, , 12F
以多加write(17,*)(x-y)*10.0d+00,int((x-y)*10.0d+00)
09/14 14:13, 12F

09/14 14:13, , 13F
得到的數字仍然是-119.000000000000 -118
09/14 14:13, 13F

09/14 14:15, , 14F
用unformatted寫到檔案裡,然後用hexdump看。
09/14 14:15, 14F

09/14 14:15, , 15F
問一下,你是用ifort嗎?
09/14 14:15, 15F

09/14 14:16, , 16F
然後xy各是多少?
09/14 14:16, 16F

09/14 14:18, , 17F
應該是ifor沒錯
09/14 14:18, 17F

09/14 14:26, , 18F
比較一下unformatted的(x-y)跟119.有沒有不一樣。
09/14 14:26, 18F

09/14 14:27, , 19F
或是換gfortran試試會不會有問題。
09/14 14:27, 19F

09/14 22:02, , 20F
改成int(x*10.0d+00-y*10.0d+00)數字就變-119了,why!?
09/14 22:02, 20F
文章代碼(AID): #1LzS6ycZ (Fortran)
文章代碼(AID): #1LzS6ycZ (Fortran)