Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran中实数的精度问题_Fortran_Precision_Gfortran_Real Datatype - Fatal编程技术网

Fortran中实数的精度问题

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,我可

我一直试图在我的研究项目中使用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,我可以看到y确实保持了它的精度,所以对于计算来说,我想这应该不是一个问题。但是为什么y的输出与我指定的值不完全相同,我该怎么做才能使它完全相同呢

只需用
双精度
替换
实数
,就可以在大多数平台上将有效小数位数从约6位增加到约15位。

这不是问题-您所看到的只是计算机中数字的浮点表示。计算机不能精确地处理实数,只能处理它们的近似值。关于这一点,可以在这里找到很好的读物:。

一般问题不限于Fortran,而是以10为基数的实数在另一个有限精度的基数中的表示。这个计算机科学问题在这里被问了很多次

对于特定的Fortran方面,声明“real”可能会给您一个单精度浮点。将常量表示为“23.234”,而不使用类型限定符。不带小数点的常量“100000”是整数,因此表达式“y*100000”导致整数隐式转换为实数,因为“y”是实数变量


关于这些问题之前的一些讨论,请参见和

这里的问题不在于Fortran,事实上它根本不是问题。这只是浮点运算的一个特点。如果您考虑如何将23.234表示为二进制中的“单浮点”,您会发现该数字必须保存到只有这么多精度的小数

关于浮点数,需要记住的是:看起来是圆的,甚至是以10为基数的数字可能不会是二进制的


有关浮点主题的简要概述,请参阅本文。要获得非常全面的解释,请查看Goldberg的canonical(PDF)。

您使用的是单精度IEEE-754浮点-请阅读以下内容: