回 帖 发 新 帖 刷新版面

主题:VCF中GT函数结果不正确的问题

程序内容是这样的:
a=0.2
b=0.4
c=0.2
d=0.2
if a+b+c+d .gt. 1. then
   write(*,*) "错误"
end if
运行结果:“错误”。
实在不懂为啥1.0会大于1.0。求高手解释。


上面的想要表达的意思。但是实际的程序中a、b、c、d是在common块中赋值的。即
common /abcd/ a,b,c,d
然后赋值。

回复列表 (共10个回复)

沙发

可能是浮点数本身的舍入误差造成, 没亲测. 本来浮点数比较就推荐跟一个"小量"比较作为判断标准.

板凳

那要怎么修改才行呢?
试验将.gt. 1.0改成.gt. 1.d0错误依然。

3 楼

另外不懂啥叫“小量” 。把最后的1.0改成1.0000001就正确了。但是这不是正确的编程方法啊。

4 楼

计算机中浮点数不能做比较,只能比较范围

5 楼

那这个程序到底要怎么编呢?你们说的那些都没解决问题啊。到底要怎么实现a+b+c+d是否大于1的问题呢?

6 楼

想要比较真值,那就不能用数值方法而用理论解
你这个例子可以把
a b c d的数值放大十倍转成整型 然后最后和10比较

7 楼

是的, 要数学上精确比较只能用整型数.
if (a+b+c+d-1.0>1.0e-6) then
之类的. 这个是做数值计算要注意的地方. 没办法回避的.

8 楼

这个和编译器有关系么?我是在改别人的程序。人家原来的程序就是那样比较的(人家用的可能是lahey编译器),应该是没有错误的。不知道为啥我用compaq的就不行。所以就感到非常奇怪啊。程序里面类似的比较还有很多地方,难道都要修改么?头痛啊

谢谢大家。

9 楼

跟浮点数处理有关, 跟编译器,cpu都有关吧, 不是很要求精度的话直接那样比较也没关系.

10 楼

CVF和IVF默认都开了FastMath,对精度会有影响的。如果改成高精度会好些,但速度就慢些了:)

我来回复

您尚未登录,请登录后再回复。点此登录或注册