我关注这个网站已经有一段时间了。我只是想问一个关于fortran90程序输出的问题。以下程序的目标是研究数列是否定义为斐波那契数列的倒数(a(n-1(/a(n((。我应该能够说如果abs(a(n-1(/a(n(-g(<e其中e从1.e-6到1.e-20,g是通过将1代入黄金比phi或通过使用分析公式(sqrt(5(-1(/2获得的复数常数。在这里,它遵循程序。
module precisione
implicit none
integer, parameter :: ik = selected_int_kind(33)
integer, parameter :: rk = selected_real_kind(33)
real (kind=rk),parameter :: g = (sqrt(5.) -1)/real(2)
real (kind=rk),parameter :: phi = (1+sqrt(5.))/real(2)
real,parameter :: e = 1.E-15
end module precisione
module successione
use precisione
implicit none
contains
recursive subroutine nonfidia(n,f,d,r)
integer(kind=ik), intent(in) :: n
integer(kind=ik), intent(out) :: f
real(kind=rk),intent(out) :: d
real(kind=rk),intent(out) :: r
integer(kind=ik):: p,s
if(n > 2) then
call nonfidia(n-1,s,d,r)
call nonfidia(n-2,p,d,r)
f = p+s
r = real(p)/real(s)
d = abs(r-g)
else
f=1
r=1
d=1-g
end if
end subroutine
end module
program calcoli
use successione
implicit none
integer(kind=ik) :: n
integer(kind=ik) :: f
real(kind=rk) :: d
real(kind=rk) :: ratio
integer(kind=ik) :: i
read*, n
do i=1,n
call nonfidia(i,f,d,ratio)
write(unit=800,fmt=*)i,f,ratio,d,e,g
print*, i,f,ratio,d,e,g
if (d < e) then
print*, "inside range , ratio = ", ratio
exit
end if
end do
if (d > e)then
print*,"not in range, add terms"
end if
end program
问题我不能超过21项,因为在那一点上,差值不知何故为零,并且它落在第一个条件下,如果条件为0.0000,实际上是<e表示我们考虑的每一个ε。我不认为问题是减法消除,因为通常你可以通过修改种类参数来使用更高的精度来解决这个问题。这里是输出:
程序输出
我不知道该怎么想。从1.E-6开始,它确实起了作用,输出在第17个do周期,1.E-7在第19个周期,它是连贯的,但从1.E-8开始,我不断收到相同的错误信息。请帮助
100
1 1 1.00000000000000000000000000000000000 0.381965994834899902343750000000000000 1.00000000E-15 0.618034005165100097656250000000000000
2 1 1.00000000000000000000000000000000000 0.381965994834899902343750000000000000 1.00000000E-15 0.618034005165100097656250000000000000
3 2 1.00000000000000000000000000000000000 0.381965994834899902343750000000000000 1.00000000E-15 0.618034005165100097656250000000000000
4 3 0.500000000000000000000000000000000000 0.118034005165100097656250000000000000 1.00000000E-15 0.618034005165100097656250000000000000
5 5 0.666666686534881591796875000000000000 4.86326813697814941406250000000000000E-0002 1.00000000E-15 0.618034005165100097656250000000000000
6 8 0.600000023841857910156250000000000000 1.80339813232421875000000000000000000E-0002 1.00000000E-15 0.618034005165100097656250000000000000
7 13 0.625000000000000000000000000000000000 6.96599483489990234375000000000000000E-0003 1.00000000E-15 0.618034005165100097656250000000000000
8 21 0.615384638309478759765625000000000000 2.64936685562133789062500000000000000E-0003 1.00000000E-15 0.618034005165100097656250000000000000
9 34 0.619047641754150390625000000000000000 1.01363658905029296875000000000000000E-0003 1.00000000E-15 0.618034005165100097656250000000000000
10 55 0.617647051811218261718750000000000000 3.86953353881835937500000000000000000E-0004 1.00000000E-15 0.618034005165100097656250000000000000
11 89 0.618181824684143066406250000000000000 1.47819519042968750000000000000000000E-0004 1.00000000E-15 0.618034005165100097656250000000000000
12 144 0.617977499961853027343750000000000000 5.65052032470703125000000000000000000E-0005 1.00000000E-15 0.618034005165100097656250000000000000
13 233 0.618055582046508789062500000000000000 2.15768814086914062500000000000000000E-0005 1.00000000E-15 0.618034005165100097656250000000000000
14 377 0.618025779724121093750000000000000000 8.22544097900390625000000000000000000E-0006 1.00000000E-15 0.618034005165100097656250000000000000
15 610 0.618037164211273193359375000000000000 3.15904617309570312500000000000000000E-0006 1.00000000E-15 0.618034005165100097656250000000000000
16 987 0.618032813072204589843750000000000000 1.19209289550781250000000000000000000E-0006 1.00000000E-15 0.618034005165100097656250000000000000
17 1597 0.618034422397613525390625000000000000 4.17232513427734375000000000000000000E-0007 1.00000000E-15 0.618034005165100097656250000000000000
18 2584 0.618033826351165771484375000000000000 1.78813934326171875000000000000000000E-0007 1.00000000E-15 0.618034005165100097656250000000000000
19 4181 0.618034064769744873046875000000000000 5.96046447753906250000000000000000000E-0008 1.00000000E-15 0.618034005165100097656250000000000000
20 6765 0.618033945560455322265625000000000000 5.96046447753906250000000000000000000E-0008 1.00000000E-15 0.618034005165100097656250000000000000
21 10946 0.618034005165100097656250000000000000 0.00000000000000000000000000000000000 1.00000000E-15 0.618034005165100097656250000000000000
inside range , ratio = 0.618034005165100097656250000000000000
您对实际种类的使用并不一致,尤其是许多运算都是用默认种类完成的,这可能比您使用rk
参数所要求的精度更低。以下是一个始终使用较高精度的程序。票据
a( 常量也有一种类型,在不指定任何内容的情况下,它们将是默认类型。如果你想要一种不同的,你需要明确地说它是
b( 除非您指定一个额外的可选参数,否则实际函数也将转换为默认类型
c( 我无法说服代码和列表在Stackoverflow上一起正确格式化。。。
ian@eris:~/work/stack$ cat fab.f90
Module precisione
Implicit None
Integer, Parameter :: ik = selected_int_Kind(33)
Integer, Parameter :: rk = selected_real_Kind(33)
Real (kind=rk),Parameter :: g = (Sqrt(5.0_rk) -1.0_rk)/2.0_rk
Real (kind=rk),Parameter :: phi = (1.0_rk+Sqrt(5.0_rk))/2.0_rk
Real (kind=rk),Parameter :: e = 1.E-15_rk
End Module precisione
Module successione
Use precisione
Implicit None
Contains
Recursive Subroutine nonfidia(n,f,d,r)
Integer(kind=ik), Intent(in) :: n
Integer(kind=ik), Intent(out) :: f
Real(kind=rk),Intent(out) :: d
Real(kind=rk),Intent(out) :: r
Integer(kind=ik):: p,s
If(n > 2) Then
Call nonfidia(n-1,s,d,r)
Call nonfidia(n-2,p,d,r)
f = p+s
r = Real(p, Kind = Kind( r ) )/Real(s, Kind = Kind( r ) )
d = Abs(r-g)
Else
f=1
r=1.0_rk
d=1.0_rk-g
End If
End Subroutine nonfidia
End Module successione
Program calcoli
Use successione
Implicit None
Integer(kind=ik) :: n
Integer(kind=ik) :: f
Real(kind=rk) :: d
Real(kind=rk) :: ratio
Integer(kind=ik) :: i
Read*, n
Do i=1,n
Call nonfidia(i,f,d,ratio)
Write(unit=800,fmt=*)i,f,ratio,d,e,g
Print*, i,f,ratio,d,e,g
If (d < e) Then
Print*, "inside range , ratio = ", ratio
Exit
End If
End Do
If (d > e)Then
Print*,"not in range, add terms"
End If
End Program calcoli
ian@eris:~/work/stack$ gfortran -O -fcheck=all -Wall -Wextra -std=f2008 fab.f90
ian@eris:~/work/stack$ ./a.out
100
1 1 1.00000000000000000000000000000000000 0.381966011250105151795413165634361840 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
2 1 1.00000000000000000000000000000000000 0.381966011250105151795413165634361840 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
3 2 1.00000000000000000000000000000000000 0.381966011250105151795413165634361840 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
4 3 0.500000000000000000000000000000000000 0.118033988749894848204586834365638160 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
5 5 0.666666666666666666666666666666666635 4.86326779167718184620798323010284749E-0002 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
6 8 0.599999999999999999999999999999999981 1.80339887498948482045868343656381790E-0002 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
7 13 0.625000000000000000000000000000000000 6.96601125010515179541316563436184030E-0003 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
8 21 0.615384615384615384615384615384615414 2.64937336527946358920221898102274545E-0003 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
9 34 0.619047619047619047619047619047619066 1.01363029772419941446078468198090626E-0003 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
10 55 0.617647058823529411764705882352941154 3.86929926365436439880952012697005884E-0004 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
11 89 0.618181818181818181818181818181818168 1.47829431923333613594983816180008114E-0004 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
12 144 0.617977528089887640449438202247191017 5.64606600072077551486321184471430512E-0005 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
13 233 0.618055555555555555555555555555555577 2.15668056607073509687211899174172578E-0005 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
14 377 0.618025751072961373390557939914163083 8.23767693347481402889445147507700748E-0006 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
15 610 0.618037135278514588859416445623342130 3.14652861974065482961125770397041390E-0006 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
16 987 0.618032786885245901639344262295081946 1.20186464894656524257207055621363756E-0006 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
17 1597 0.618034447821681864235055724417426583 4.59071787016030468890051788423244255E-0007 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
18 2584 0.618033813400125234815278647463994977 1.75349769613389308186901643182656767E-0007 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
19 4181 0.618034055727554179566563467492260061 6.69776593313619766331266219010299554E-0008 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
20 6765 0.618033963166706529538387945467591504 2.55831883186661988888980466554972085E-0008 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
21 10946 0.618033998521803399852180339985218040 9.77190855164759350561957988060738922E-0009 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
22 17711 0.618033985017357938973140873378403072 3.73253690923144596098723508783041383E-0009 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
23 28657 0.618033990175597086556377392580881950 1.42570223835179055821524379070670731E-0009 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
24 46368 0.618033988205325051470844819764804385 5.44569796733742014600833774707823291E-0010 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
25 75025 0.618033988957902001380262249827467253 2.08007153175675415461829093100635152E-0010 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
26 121393 0.618033988670443185604798400533155613 7.94516625997884338324825462573575097E-0011 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
27 196418 0.618033988780242682856507376866870418 3.03478346519205425012322582668039137E-0011 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
28 317811 0.618033988738303006852732437963934105 1.15918413518543964017040549735541358E-0011 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
29 514229 0.618033988754322537608830405492572618 4.42768940424357112693445786493866695E-0012 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
30 832040 0.618033988748203621343798191078293911 1.69122686078864328734424877133339579E-0012 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
31 1346269 0.618033988750540839382721984519974993 6.45991178135150154336833610760961439E-0013 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
32 2178309 0.618033988749648101530971893432887521 2.46746673614940932750639110506896385E-0013 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
33 3524578 0.618033988749989097047296779290725048 9.42488427099449250868884736278446728E-0014 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
34 5702887 0.618033988749858848350071980248415539 3.59998545148541172226208047535336351E-0014 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
35 9227465 0.618033988749908598925421457588060227 1.37507208346232224220669885957802422E-0014 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
36 14930352 0.618033988749889595896597819661196270 5.25230798901470444188988345745259482E-0015 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
37 24157817 0.618033988749896854407719255379913368 2.00620313242101427520822532300926455E-0015 9.99999999999999999999999999999999987E-0016 0.618033988749894848204586834365638160
注意,我在程序完成之前就杀死了它