作者motoman (Beautiful People)
看板Fortran
标题Re: [问题] 新手写程式~~
时间Wed Apr 14 10:00:24 2010
※ 引述《tonyruler (TONY)》之铭言:
: 问题是要做从 0积到0.5 1/(1+X^2) dx
: 以下是我写的程式
: program hwp165
: implicit none
: integer i
: real*8::z
: z=0
浮点数要加小数点编译器才会知道 像是 z=0.0 ,z=0.0_8
我的习惯是会再宣告一个指定精确度的整数
integer,parameter :: pre=8
之後所有的浮点数都可以写成1.0_pre之类的
然後想改精确度 直接把那一行改成4或其他的就好了
: do i=0,5,0.05
计数器要用整数= =
: z=z+0.005*(1/(1+(i*i)/100))
i => real(i) or dble(i)
100 => 100.0_pre
: enddo
: write(*,"(I15.14)")z
这边浮点数要用F 而且用15.14不好 前面要设多一点
像是F17.13这样因为小数点和负号也会占空间
: stop
: end
这边我还是习惯写end program
函式写 end subroutine XXX 这样才不会对错 函式A对到函式B的结尾
结果你打错 编译还会过的情况发生
: ~
: 用f95可编译後
: 执行执行档
: 出现
: Floating point exception 是啥意思?
: 还有 do的起始跟终点好像只能用整数的样子?
: 我宣告i为浮点数会出错ㄟ
: 有办法把i设成浮点数??
: 帮帮新手XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.114.94.152
※ 编辑: motoman 来自: 140.114.94.152 (04/14 10:01)
1F:→ agody:不需要宣告pre, 100.0_pre 打成 100.d0就好了 d是double 04/14 15:35
2F:推 gdi2000520:我也觉得不用宣告pre 直接双精度就好哩 04/14 18:54
你们说的大部份情况都对~但是我们这样写是有各种的考量
第一个是有人在做计算时是希望他能随时改精确度的
想要算快一点的 就先改成单精度 想求准 就用双精度 或是更高
你没有听错 我就看过有人用kind=10,12,或16在计算(不是我就是了)
而且线上的函式库不支援这种格式 就自己写了一个来呼叫XD
还有另一个是不同compiler的双精度有可能准度不太一样
同是kind=8或1d0 遇到别的compiler 还是会帮算 但最後几位就会不太准
(虽然我还没遇过例外) 其实我们会更保险的用selected_real_kind
这指令来给compiler自己选精度 这个程式也比较具有移植性
我还认识有人连回圈计数器都设成kind=2为了让计算更快一点
很恐怖= =||
※ 编辑: motoman 来自: 140.114.94.152 (04/14 20:14)
※ 编辑: motoman 来自: 140.114.94.152 (04/14 20:16)
3F:推 gdi2000520:收到~~~^^ 04/15 09:52
4F:推 tonyruler:我照原波改了还是不行ㄟ~~~~~ 04/15 23:14