[問題] int計算錯誤

作者: ttjhninn (Cream)   2015-09-14 02:34:34
一個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
恩...我無言了...= =''
作者: onezillion (寶貝)   2015-09-14 09:56:00
int只取整數部分,無視小數點進位?
作者: kerwinhui (kezza)   2015-09-14 10:58:00
如果要四捨五入請先加 sgn*0.5D0如果你是用gfortran可以用nint,ifort的話不建議使用
作者: rex0707 (我就是我)   2015-09-14 13:22:00
INT 是無條件捨去
作者: blc (Anemos)   2015-09-14 13:42:00
就 -119.00 其實是 -118.9999999~ 我猜x,y值都滿大的,相減之後的差值有碰到有效位數的問題。
作者: ttjhninn (Cream)   2015-09-14 13:44:00
可是print出來的數不會就是他算出來的數字嗎?他print出來的數字的確是-119.0000000....啊
作者: blc (Anemos)   2015-09-14 13:56:00
print出來的是會四捨五入的(印象中)
作者: ttjhninn (Cream)   2015-09-14 14:02:00
那有辦法可以看到實際計算出來的直嗎?
作者: rex0707 (我就是我)   2015-09-14 14:04:00
格式化輸出吧
作者: ttjhninn (Cream)   2015-09-14 14:13:00
以多加write(17,*)(x-y)*10.0d+00,int((x-y)*10.0d+00)得到的數字仍然是-119.000000000000 -118
作者: blc (Anemos)   2015-09-14 14:15:00
用unformatted寫到檔案裡,然後用hexdump看。問一下,你是用ifort嗎?然後xy各是多少?
作者: ttjhninn (Cream)   2015-09-14 14:18:00
應該是ifor沒錯
作者: blc (Anemos)   2015-09-14 14:26:00
比較一下unformatted的(x-y)跟119.有沒有不一樣。或是換gfortran試試會不會有問題。
作者: ttjhninn (Cream)   2015-09-14 22:02:00
改成int(x*10.0d+00-y*10.0d+00)數字就變-119了,why!?

Links booklink

Contact Us: admin [ a t ] ucptt.com