回 帖 发 新 帖 刷新版面

主题:求助一个很纠结很诡异的精度的问题!

小弟是新手哈。。我要定义圆周率pi,但精度总有问题。先定义real(8) pi,然后是用双精度的datan()函数定义的,pi=4.0*datan(1.0) 结果显示出来是3.14159 26535 89793 11599 79634 68544 185162从第15位小数就不精确了。好吧。。那我找现成的精确到25位小数(对我够用了)的值直接赋值给pi,结果显示出来3.14159 27410 12573 24218 700000后面全是0。。居然第6位小数就不对了!难道手动赋值都误差这么大!求大牛解释这是怎么回事?对了,定义为real(16)也没用,我因为要用imsl所以用的是微软的visual fortran,编译器intel的

回复列表 (共7个回复)

沙发

单精度有效数字就6~7位. 双精度有效数字就15~16位. 你硬输出那么多也是没意义的.
然后你说截断了前面15位赋值是不是类似这样 pi=3.14159 26535 89793 ?
这个问题在以前的帖子里面被问过很多次. 等号右边的数其实还是单精度的(如果你编译器默认是单精度的话.)存储的时候就被截断到6~7位的地方然后赋值给pi, 过程中再转换成双精度. 你可以
pi=3.14159 26535 89793D0

开始的pi=4.0*datan(1.0)计算的时候是否会报错? 会不会是pi=4.0*datan(1.0D0). 你前后给的信息让我不知道你选用的默认浮点数精度是什么.

板凳


呃。。忘记说了,我记得后来改成pi=4.0*datan(real(1.0,8)),没报错,效果和datan(1.0D0)是一样的。刚刚我试了试定义pi为real(16),可还是只有前6位小数是准的。那么难道就不能手动输入很多位有效数字吗?

3 楼

用pi=3.141592653589793D0或者pi=3.141592653589793_8 大多数编译器下都可以.
real(kind=16) 在cvf下我不确定是否支持, 虽然它很多内部函数有四精度的实体函数, 但我记得以前尝试定义四精度数报错. 关键是四精度数没有硬件支持,运算速度慢的可怜.

4 楼

real(1.0,8) 就多了一次不必要的转换了.

5 楼

若是您对浮点数精度感兴趣,不妨看看 IEEE 754,认真看完、理解后,你就上了一个层次。

6 楼

Visual Fortran是Intel的。只是Windows下的开发环境用的是MS的而已。

7 楼

[url=http://www.worldgodshop.com/]Supra Shoes[/url]   [url=http://www.worldgodshop.com/]Radii shoes[/url]  [url=http://www.worldgodshop.com/]Prada Shoes[/url]   [url=http://www.worldgodshop.com/]Jordan shoes[/url]  [url=http://www.worldgodshop.com/]Christian Louboutin shoes[/url] 
http://www.worldgodshop.com/

我来回复

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