回 帖 发 新 帖 刷新版面

主题:运行时出错了,不知原因,求大神解释

function f(x)result(n)
 
       if(x>-14.178.and.x<=18.757)then 
     n=1
    elseif(x>-56.100.and.x<=-55.400.or.x>-51.700.and.x<=-51.100& 
      .or. x>-38.100.and.x<=-32.600.or.x>-32.000.and.x<=-30.200&
      .or. x>-15.500.and.x<=-12.300)then
     n=0

      else
     n=-1
   endif
   end
  
program gz2

real x,a
x=-59.243

print*, x                   
    do while (x<18.757)
      a=x
      i=f(x)

      select case(i)
         case(1)
         x=x+1.99
         case(0)
         x=x+1.44
         case(-1)
         x=x+2.86
      end select
       print*,x,x-a

    end do

end

回复列表 (共11个回复)

沙发

把错误提示贴上,或是调试一下。

板凳


       program gz2

real x,y
x=-59.243

  print*, x,x+0.01                   
do while (x<18.757)
 y=0 
   do while(y<9)
          
 x=x+0.01
     if(x>14.178.and.x<=18.757)then 
      v=0.045216
     elseif(x>-56.100.and.x<=-55.400.or.x>-51.700.and.x<=-51.100& 
      .or. x>-38.100.and.x<=-32.600.or.x>-32.000.and.x<=-30.200&
      .or. x>-15.500.and.x<=-12.300)then
       v=0.062547
     else
      v=0.0314
     endif           

 y=y+v


 end do
   
  print*, x,y
 
end do 
end
编译,运行都没错
只是结果令我蛋疼 
x每次都只有加0.01
按理小数点第3位及之后都不会变
但x小数点后变得千奇百怪
让我都怀疑是不是Fortran安装出错了
 想了一周没想通

3 楼

real x,y
改为:
real(8) x,y

另:你别指望计算机能精确表示所有的小数。毕竟它的有效数位有限,且存储在计算机中是以二进制存储的:)

4 楼

为什么有时很精确,有时候不行呢

5 楼

因为有的数用2进制表示是可以精确表示的,但有些十进制的有限小数用二进制时却变成了循环小数:)

6 楼

谢谢,这个问题我明白了,还有一个疑惑,希望解答
  program do_while
 real x,y
 do while(y<=10)
 y=y+0.01
 x=x+0.01
  print*,x,y
 enddo
 end 
运行后输出应该x,y应该从0.01到10,可为什们Fortran运行输出是从7.多到10

7 楼

还有,这个论坛怎么不能传电脑上的图片啊


8 楼

[quote]谢谢,这个问题我明白了,还有一个疑惑,希望解答
  program do_while
 real x,y
 do while(y<=10)
 y=y+0.01
 x=x+0.01
  print*,x,y
 enddo
 end 
运行后输出应该x,y应该从0.01到10,可为什们Fortran运行输出是从7.多到10
[/quote]
x和y没有初始化,初值不确定。

9 楼

[quote]还有,这个论坛怎么不能传电脑上的图片啊[/quote]一楼可以传。

10 楼

不赋予初值,不是默认为0吗?
而且赋了初值为0后
运行结果还一样从7到10

我来回复

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