回 帖 发 新 帖 刷新版面

主题:[讨论]sqrt() DOMAIN error该怎么解决

我算个程序,sqrt(1+x),x是个表达式,x的值是-1----0之间的数字,输出sqrt(1+x),屏幕上提示出错,DOMAIN error,好像说开根号那个表达式出错了,超出范围了,但是我的程序没超出范围啊?1+x还是0到1的数字啊,该怎么解决这个问题呢?把1换成1.0001就可以算了,这问题该怎么解决呢?

回复列表 (共4个回复)

沙发


代码
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

板凳


楼主, 一些不说不快的话:
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 楼


不知道是否设置的pi的格式有问题,我让pi=3.1415就算出来结果了,位数 太多可能e也取那么多吧,这时候就出现负数了

4 楼

应该是一个精度问题, 既然你的算法没办法保证那个书是正数, 可以考虑加个abs到被开放数.

我来回复

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