Fortran Coder

负数求三次方根的NaN问题,多谢啦!

查看数: 17560 | 评论数: 10 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2015-9-30 01:42

正文摘要:

不说多的 直接上源代码 [Fortran] 纯文本查看 复制代码 program ex110 implicit none DIMENSION U(2),UI1(3),UI2(6),UI3(6) REAL(8) Nv, chi, lambda0, detF0,vcho,vcmo,vcpo,fa,fb,Ka,Kb,vNa REAL(8) U ,UI1, UI2 ...

回复

深流水静水流深 发表于 2016-4-3 07:20:23
学习了,呵呵
vvt 发表于 2016-3-19 20:11:04
float invalid operation 是 运行时错误

运行时错误,属于动态问题。往往不仅仅是代码本身错误导致的。而是数据不合适,或算法不严谨导致的。

比如
[Fortran] 纯文本查看 复制代码
program ex110
implicit none
DIMENSION U(2),UI1(3),UI2(6),UI3(6) 
REAL(8) Nv, chi, lambda0, detF0,vcho,vcmo,vcpo,fa,fb,Ka,Kb,vNa
REAL(8) U ,UI1, UI2 ,UI3,aa, bb, cc ,dd, ee, deltaa, deltab,deltac
REAL(8) BI1,BI2,AJ
REAL(8) delta,vch,GAJ, DGAJDAJ, DDGAJDDAJ, DDDGAJDDDAJ 
REAL(8) DGAJDvch ,DDGAJDDvch, DDDGAJDDDvch 
REAL(8) DDGAJDAJDvch, DDDGAJDAJDDvch, DDDGAJDDAJDvch
REAL(8) DvchDAJ, DDvchDDAJ, DDDvchDDDAJ
REAL(8) D1GAJDAJ, D2GAJDAJ, D3GAJDAJ,TEMP
BI1=10.0
AJ=1.0
TEMP=2.0
Nv = 0.001
chi = 0.1
lambda0 = 3.39
detF0 = lambda0**3.0
vNa=0.0602
vcpo=vNa*(10.0**(-3.0))
vcho=vNa*(10.0**(-TEMP))
vcmo=vcpo+vcho
Ka=10.0**(-4.3)
Kb=10.0**(-10.0)
fa=0.05
fb=0.0
!。。。。。。中间省略部分无关代码


aa=AJ*detF0*(vcho+vcpo)

bb=fb*vcho+AJ*detF0*Ka*(vcho+vcpo)*vNa+ AJ*detF0*Kb*(vcho + 
&vcpo)*vNa

cc=-(AJ*detF0*vcho**2*vcmo)-fa*Ka*vcho*vNa+fb*Ka*vcho*vNa+ 
&AJ*detF0*Ka*Kb*(vcho+vcpo)*vNa**2
dd=-(AJ*detF0*Ka*vcho**2*vcmo*vNa)-AJ*detF0*Kb*vcho**2*vcmo*v
&Na-fa*Ka*Kb*vcho*vNa**2

ee=AJ*detF0*Ka*Kb*vcho**2*vcmo*vNa**2

deltaa=cc**2-3*bb*dd+12*aa*ee

deltab=2*cc**3-9*bb*cc*dd+27*aa*dd**2-72*aa*cc*ee
deltac=(deltab+Sqrt(abs(-4.0*deltaa**3.0+deltab**2.0)))
&**(1.0/3.0)

delta=(2**(1/3)*deltaa)/(3*aa*deltac)+deltac/(3*2**(1/3)*aa)
!。。。。。。。。。。。以下省略部分无关代码。。。。。。。。。


这个代码本身是没有错误的,但是当用户输入 0 时,就会出现 float invalid operation

这就是动态错误。建议你通过 debug 单步调试查找这类错误的原因。

如果你不熟悉 debug 单步调试,可以看这里的视频教程:http://v.fcode.cn/video-debugger.html
wutong-sky 发表于 2016-3-19 16:17:29
vvt 发表于 2016-3-18 22:44
请参考楼上的案例,依葫芦画瓢。

RRL0=(RRL-UUAB)/(CH*(FF1+FF2))
麻烦问一下,这一句怎么改?
vvt 发表于 2016-3-18 22:44:53
请参考楼上的案例,依葫芦画瓢。
wutong-sky 发表于 2016-3-18 22:22:53
楚香饭 发表于 2015-9-30 07:35
由于浮点数有误差。所以 1.0/3.0 并不能精确的表示 1/3,例如可能是 0.333333334,极大可能是一个偶数分之 ...

RRL=SQRT(UUAB**2+CH**2*(FF1**2-FF2**2))
RRL0=(RRL-UUAB)/(CH*(FF1+FF2))
师兄,麻烦问一下,我debug在这两句这出现了float invalid operation,怎么改?谢谢
wutong-sky 发表于 2016-3-18 22:17:05
楚香饭 发表于 2015-9-30 07:35
由于浮点数有误差。所以 1.0/3.0 并不能精确的表示 1/3,例如可能是 0.333333334,极大可能是一个偶数分之 ...

麻烦问一下师兄,RRL=SQRT(UUAB**2+CH**2*(FF1**2-FF2**2))
                        RRL0=(RRL-UUAB)/(CH*(FF1+FF2))
其中UUAB为正,CH为正
pasuka 发表于 2016-1-2 20:14:46
楚香饭 发表于 2015-9-30 07:35
由于浮点数有误差。所以 1.0/3.0 并不能精确的表示 1/3,例如可能是 0.333333334,极大可能是一个偶数分之 ...

查了一下,C++11的标准里面已经有一个cbrt函数专门开三次方根,不知道Fortran何时跟进
糖盒love玲珑 发表于 2015-12-28 19:18:28
楚兄 这个例子好 可以作为新手认识浮点数误差的一个很好案例! 受教了.
小智 发表于 2015-9-30 08:30:05
楚香饭 发表于 2015-9-30 07:35
由于浮点数有误差。所以 1.0/3.0 并不能精确的表示 1/3,例如可能是 0.333333334,极大可能是一个偶数分之 ...

果然编译成功了 谢谢大神!

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-16 01:05

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表