2

我一直在尝试将 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 的输出与我指定的值不完全相同,我该怎么做才能使其完全相同?

4

4 回答 4

10

这不是问题 - 您所看到的只是计算机中数字的浮点表示。计算机不能精确地处理实数,而只能处理它们的近似值。可以在此处找到有关此内容的好读物:每个计算机科学家都应该了解的浮点运算知识

于 2012-04-04T17:37:23.020 回答
2

只需用 替换realdouble precision您就可以在大多数平台上将有效小数位数从大约 6 位增加到大约 15 位。

于 2012-04-04T17:37:17.263 回答
1

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

关于浮点数要记住的一点是:看起来四舍五入甚至以 10 为底的数字可能不会是 binary

有关浮点主题的简要概述,请查看Wikipedia文章。如需非常详尽的解释,请查看 Goldberg 的规范论文(PDF)。

于 2012-04-05T06:26:42.010 回答
1

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

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

有关这些问题的先前讨论,请参阅扩展双精度Fortran:整数*4 与整数(4)与整数(种类 = 4)Fortran 90 中是否有更好的双精度分配?

于 2012-04-04T18:51:27.383 回答