主题:VCF中GT函数结果不正确的问题
bfbfvu
[专家分:0] 发布于 2011-11-27 02:53:00
程序内容是这样的:
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个回复)
沙发
yeg001 [专家分:14390] 发布于 2011-11-27 10:06:00
可能是浮点数本身的舍入误差造成, 没亲测. 本来浮点数比较就推荐跟一个"小量"比较作为判断标准.
板凳
bfbfvu [专家分:0] 发布于 2011-11-27 23:05:00
那要怎么修改才行呢?
试验将.gt. 1.0改成.gt. 1.d0错误依然。
3 楼
bfbfvu [专家分:0] 发布于 2011-11-27 23:06:00
另外不懂啥叫“小量” 。把最后的1.0改成1.0000001就正确了。但是这不是正确的编程方法啊。
4 楼
dongyuanxun [专家分:7180] 发布于 2011-11-28 00:26:00
计算机中浮点数不能做比较,只能比较范围
5 楼
bfbfvu [专家分:0] 发布于 2011-11-28 02:59:00
那这个程序到底要怎么编呢?你们说的那些都没解决问题啊。到底要怎么实现a+b+c+d是否大于1的问题呢?
6 楼
dongyuanxun [专家分:7180] 发布于 2011-11-28 06:18:00
想要比较真值,那就不能用数值方法而用理论解
你这个例子可以把
a b c d的数值放大十倍转成整型 然后最后和10比较
7 楼
yeg001 [专家分:14390] 发布于 2011-11-28 09:35:00
是的, 要数学上精确比较只能用整型数.
if (a+b+c+d-1.0>1.0e-6) then
之类的. 这个是做数值计算要注意的地方. 没办法回避的.
8 楼
bfbfvu [专家分:0] 发布于 2011-11-28 19:41:00
这个和编译器有关系么?我是在改别人的程序。人家原来的程序就是那样比较的(人家用的可能是lahey编译器),应该是没有错误的。不知道为啥我用compaq的就不行。所以就感到非常奇怪啊。程序里面类似的比较还有很多地方,难道都要修改么?头痛啊
谢谢大家。
9 楼
yeg001 [专家分:14390] 发布于 2011-11-28 23:49:00
跟浮点数处理有关, 跟编译器,cpu都有关吧, 不是很要求精度的话直接那样比较也没关系.
10 楼
cgl_lgs [专家分:21040] 发布于 2011-11-29 14:35:00
CVF和IVF默认都开了FastMath,对精度会有影响的。如果改成高精度会好些,但速度就慢些了:)
我来回复