Fortran中实数的精度问题
我一直试图在我的研究项目中使用Fortran,使用GNU Fortran编译器(gfortran),最新版本, 但我在处理实数的过程中遇到了一些问题。例如,如果您有以下代码:Fortran中实数的精度问题,fortran,precision,gfortran,real-datatype,Fortran,Precision,Gfortran,Real Datatype,我一直试图在我的研究项目中使用Fortran,使用GNU Fortran编译器(gfortran),最新版本, 但我在处理实数的过程中遇到了一些问题。例如,如果您有以下代码: program test implicit none real :: y = 23.234, z z = y * 100000 write(*,*) y, z end program 您将获得以下输出: 23.23999 2323400.0 我觉得这很奇怪。 有人能告诉我这里到底发生了什么吗?看着z,我可
program test
implicit none
real :: y = 23.234, z
z = y * 100000
write(*,*) y, z
end program
您将获得以下输出:
23.23999 2323400.0
我觉得这很奇怪。
有人能告诉我这里到底发生了什么吗?看着z,我可以看到y确实保持了它的精度,所以对于计算来说,我想这应该不是一个问题。但是为什么y的输出与我指定的值不完全相同,我该怎么做才能使它完全相同呢 只需用
双精度
替换实数
,就可以在大多数平台上将有效小数位数从约6位增加到约15位。这不是问题-您所看到的只是计算机中数字的浮点表示。计算机不能精确地处理实数,只能处理它们的近似值。关于这一点,可以在这里找到很好的读物:。一般问题不限于Fortran,而是以10为基数的实数在另一个有限精度的基数中的表示。这个计算机科学问题在这里被问了很多次
对于特定的Fortran方面,声明“real”可能会给您一个单精度浮点。将常量表示为“23.234”,而不使用类型限定符。不带小数点的常量“100000”是整数,因此表达式“y*100000”导致整数隐式转换为实数,因为“y”是实数变量
关于这些问题之前的一些讨论,请参见和这里的问题不在于Fortran,事实上它根本不是问题。这只是浮点运算的一个特点。如果您考虑如何将23.234表示为二进制中的“单浮点”,您会发现该数字必须保存到只有这么多精度的小数 关于浮点数,需要记住的是:看起来是圆的,甚至是以10为基数的数字可能不会是二进制的
有关浮点主题的简要概述,请参阅本文。要获得非常全面的解释,请查看Goldberg的canonical(PDF)。您使用的是单精度IEEE-754浮点-请阅读以下内容: