作者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/cn.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