作者ttjhninn (Cream)
看板Fortran
標題[問題] int計算錯誤
時間Mon Sep 14 02:34:34 2015
一個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://webptt.com/m.aspx?n=bbs/Fortran/M.1442169276.A.9A3.html
1F:→ onezillion: int只取整數部分,無視小數點進位? 09/14 09:56
2F:→ kerwinhui: 如果要四捨五入請先加 sgn*0.5D0 09/14 10:58
3F:→ kerwinhui: 如果你是用gfortran可以用nint,ifort的話不建議使用 09/14 11:02
4F:→ rex0707: INT 是無條件捨去 09/14 13:22
5F:→ blc: 就 -119.00 其實是 -118.9999999~ 我猜x,y值都滿大的, 09/14 13:42
6F:→ blc: 相減之後的差值有碰到有效位數的問題。 09/14 13:42
7F:→ ttjhninn: 可是print出來的數不會就是他算出來的數字嗎? 09/14 13:44
8F:→ ttjhninn: 他print出來的數字的確是-119.0000000....啊 09/14 13:46
9F:→ blc: print出來的是會四捨五入的(印象中) 09/14 13:56
10F:→ ttjhninn: 那有辦法可以看到實際計算出來的直嗎? 09/14 14:02
11F:→ rex0707: 格式化輸出吧 09/14 14:04
12F:→ ttjhninn: 以多加write(17,*)(x-y)*10.0d+00,int((x-y)*10.0d+00) 09/14 14:13
13F:→ ttjhninn: 得到的數字仍然是-119.000000000000 -118 09/14 14:13
14F:→ blc: 用unformatted寫到檔案裡,然後用hexdump看。 09/14 14:15
15F:→ blc: 問一下,你是用ifort嗎? 09/14 14:15
16F:→ blc: 然後xy各是多少? 09/14 14:16
17F:→ ttjhninn: 應該是ifor沒錯 09/14 14:18
18F:→ blc: 比較一下unformatted的(x-y)跟119.有沒有不一樣。 09/14 14:26
19F:→ blc: 或是換gfortran試試會不會有問題。 09/14 14:27
20F:→ ttjhninn: 改成int(x*10.0d+00-y*10.0d+00)數字就變-119了,why!? 09/14 22:02