Fortran error when calculating cosx

◇◆丶佛笑我妖孽 提交于 2019-12-13 05:20:17

问题


I was assigned the following problem:

Make a Fortran program which will be able to read a degree[0-360] checking validity range(not type) and it will be able to calculate and print the cos(x) from the following equation, where x is in radians:

cos(x)=1-x^2/2! + x^4/4!-x^6/6!+x^8/8!-...

As a convergence criteria assume 10^(-5) using the absolute error between two successive repeats (I suppose it means do's).

For the calculation of the ! the greatest possible kind of integer should be used. Finally the total number of repeats should be printed on screen.

So my code is this:

    program ex6_pr2
implicit none
!Variables and Constants
integer::i
real*8::fact,fact2 !fact=factorial
real,parameter::pi=3.14159265
double precision::degree,radiants,cosradiants,s,oldcosradiants,difference                         !degree,radiants=angle
print*,'This program reads and calculates an angle`s co-sinus'
print*,'Please input the degrees of the angle'
read*,degree
do while(degree<0 .or. degree>360) !number range
read*,degree
print*,'Error input degree' 
cycle
end do
radiants=(degree*pi/180)
fact=1
fact2=1
s=0
cosradiants=0
!repeat structure
do i=2,200,1
fact=fact*i
fact2=fact2*(i+2)
oldcosradiants=cosradiants
cosradiants=(-(radiants)**i/fact)+(((radiants)**(i+2))/fact2)
difference=cosradiants-oldcosradiants
s=s+cosradiants
if(abs(difference)<1e-5) exit
end do
!Printing results
print*,s+1.

end program

I get right results for angles such as 45 degrees (or pi/4) and wrong for other for example 90 degrees or 180.

I have checked my factorials where I believe the error is hidden (at least for me).

Well I created another code which seems unable to run due to the following error:FUNCTION name,(RESULT of PROJECT2_EX6~FACT),used where not expected,perhaps missing '()'

    program project2_ex6
implicit none
integer(kind=3)::degrees,i,sign
integer::n
double precision::x,err_limit,s_old,s
real,parameter::pi=3.14159265359
print*,'This program calculates the cos(x)'
print*,"Enter the angle's degrees"
read*,degrees
do
if(degrees<0.or.degrees>360) then
  print*,'Degrees must be between 0-360'
  else
   x=pi*degrees/180
    exit
    end if
    end do
    sign=1
    sign=sign*(-1)
    err_limit=1e-5
 n=0
    s=0
    s_old=0
do
  do i=1,n
    end do
  s=(((-1.)**n/(fact(2.*n)))*x**(2.*n))*sign
 s=s+s_old

n=n+1
if(abs(s-s_old)<1e-5) then
  exit
  else
    s_old=s
    cycle
    end if
  end do
  print*,s,i,n
contains
real function fact(i)
double precision::fact
integer::i
if(i>=1) then
  fact=i*fact(i-1)
  else
fact=1
    end if
return
end function
  end program

回答1:


Although it is your homework, I will help you here. The first thing which is wrong is ýour factorial which you need to replace with

 fact  = 1
 do j = 1,i
    fact = fact*j
 enddo

second it is easier if you let your do loop do the job so run it as

do i=4,200,2

and predefine cosradians outside the do loob with

cosradiants = 1-radiants**2/2

additionally you need to take into account the changing sign which you can do in the loop using

   sign = sign*(-1)

and starting it off with sign = 1 before the loop

in the loop its then

   cosradiants= cosradiants+sign*radiants**i/fact

If you have included these things it should work (at least with my code it does)



来源:https://stackoverflow.com/questions/33671576/fortran-error-when-calculating-cosx

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!