主题:[讨论]sqrt() DOMAIN error该怎么解决
tianhy2010
[专家分:60] 发布于 2010-05-09 20:07:00
我算个程序,sqrt(1+x),x是个表达式,x的值是-1----0之间的数字,输出sqrt(1+x),屏幕上提示出错,DOMAIN error,好像说开根号那个表达式出错了,超出范围了,但是我的程序没超出范围啊?1+x还是0到1的数字啊,该怎么解决这个问题呢?把1换成1.0001就可以算了,这问题该怎么解决呢?
最后更新于:2010-05-09 20:19:00
回复列表 (共4个回复)
沙发
tianhy2010 [专家分:60] 发布于 2010-05-09 20:15:00
代码
program energy
real,parameter::pi=3.1415926
real a
real kx,ky,e,t
a=2.463
open(1,file='energ.dat')
do kx=-4*pi/(3*a),4*pi/(3*a),0.01
if(-2*pi/(3*a)>=kx) then
ky=sqrt(3.0)*(kx+4.*pi/(3*a))
else
if(2*pi/(3*a)>=kx) then
ky=2*sqrt(3.0)*pi/(3*a)
else
ky=sqrt(3.0)*(-kx+4*pi/(3*a))
end if
end if
e=sqrt(1.00+4.0*cos(0.5*a*kx)*cos(sqrt(3.0)*a*ky/2.0)+4.0*cos(0.5*a*kx)**2)
write(1,'(f8.2,f8.2,f8.3)') kx,ky,e
end do
end
板凳
yeg001 [专家分:14390] 发布于 2010-05-09 23:01:00
楼主, 一些不说不快的话:
1. do kx=-4*pi/(3*a),4*pi/(3*a),0.01 这样的语句不要写了, 虽然这个规则在f90里有, 但很快被抛弃了. 你会觉得你这样写直观, 程序本身就辛苦了.
2. 一个好的习惯是自己写的程序不顺手加上implicit none
program energy
real,parameter::pi=3.1415926
real a
real kx,ky,e,t
a=2.463
open(1,file='energ.dat')
do kx=-4*pi/(3*a),4*pi/(3*a),0.01
if(-2*pi/(3*a)>=kx) then
ky=sqrt(3.0)*(kx+4.*pi/(3*a))
else
if(2*pi/(3*a)>=kx) then
ky=2*sqrt(3.0)*pi/(3*a)
else
ky=sqrt(3.0)*(-kx+4*pi/(3*a))
end if
end if
[color=FF0000][b] write(*, *) 1.00+4.0*cos(0.5*a*kx)*cos(sqrt(3.0)*a*ky/2.0)+4.0*cos(0.5*a*kx)**2
pause[/b][/color]
e=sqrt(1.00+4.0*cos(0.5*a*kx)*cos(sqrt(3.0)*a*ky/2.0)+4.0*cos(0.5*a*kx)**2)
write(1,'(f8.2,f8.2,f8.3)') kx,ky,e
end do
end
-4.9089500E-08
Fortran Pause - Enter command<CR> or <CR> to continue.
确实是小于0了
3 楼
tianhy2010 [专家分:60] 发布于 2010-05-10 11:42:00
不知道是否设置的pi的格式有问题,我让pi=3.1415就算出来结果了,位数 太多可能e也取那么多吧,这时候就出现负数了
4 楼
yeg001 [专家分:14390] 发布于 2010-05-10 12:21:00
应该是一个精度问题, 既然你的算法没办法保证那个书是正数, 可以考虑加个abs到被开放数.
我来回复