1. Not finding help here? Sign up for a free 30min tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Help with fortran

  1. Nov 11, 2015 #1
    Hello 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:
    cos(x)=1-x^2/2! + x^4/4!-x^6/6!+x^8/8!-...,where x is in radiants.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.

    I have been trying really hard to make it run properly but I still have some questions,which I would be greatful would you be able to answer them.1)How can I measure the diffrence of two succesive repeats?
    2)The command iostat will work only for the read it corresponds?
    Code (Fortran):
    program askhsh6_ergasia2
    implicit none
    print*,'This program reads and calculates an angle`s co-sinus'
    print*,'Please input the degrees of the angle'
    do while(degree<0 .or. degree>360)
      print*,'Error input degree'
      end do
    do i=2,100,2

    end do

    end program
    Last edited by a moderator: Nov 11, 2015
  2. jcsd
  3. Nov 11, 2015 #2
    Your factorials are jumping over some numbers. Also, these numbers will get fairly large, so you may have some numerical problems.

    For convergence, you should probably test if cosradiants lt 10^-5 and break out of the loop if true.
  4. Nov 11, 2015 #3
    You mean you want to do something like this:
    Code (Fortran):

    READ(*,*,IOSTAT=io) x
    Then the value of io corresponds to x, each read will generate a new IOSTAT for that read that you will have to give to some variable.

    Hope this helps.

    edit: of course you need to check your original code, as Khashishi mentioned, your factorials are wrong.
    Last edited by a moderator: Nov 11, 2015
  5. Nov 11, 2015 #4
    No, you don't need to calculate the difference in cosradiants. cosradiants is already the difference between pairwise terms in the series, since you are adding them all together into s.
  6. Nov 11, 2015 #5


    User Avatar
    Staff Emeritus
    Science Advisor
    Homework Helper

    A four-byte Fortran REAL data type has a max. magnitude of about 10-38 to 1038. This means that only about 33! can be represented in single-precision REAL data types. If you want to go higher than 33!, you'll need to use a DOUBLE PRECISION data type.
  7. Nov 11, 2015 #6
    Hello everyone ! Thank you very much for your help I really appreciate that! Could you please explain why my factorials are wrong? It's strange since I get correct answers only for some degrees e.x 45 and wrong for many others such as 90 degrees.Thanks in advance
  8. Nov 11, 2015 #7
    You are skipping many numbers since your loop counts by 2. Also, you are using integer*4 which is much too small to store factorials larger than 12! or so. You should probably use real*8.
  9. Nov 11, 2015 #8


    User Avatar
    Staff Emeritus
    Science Advisor
    Homework Helper

    Even though you're using 2!, 4!, 6!, 8!, etc. 8! is still 1×2×3×4×5×6×7×8, so you can't skip over numbers in calculating the correct value of the factorial.

    8! ≠ 6! × 8

    8! = 6! × 7 × 8
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?
Draft saved Draft deleted

Similar Discussions: Help with fortran
  1. Help with fortran (Replies: 1)

  2. Fortran Help! (Replies: 4)

  3. Fortran help (Replies: 16)