gpt4 book ai didi

fortran - Fortran 95 : 中的数值精度

转载 作者:行者123 更新时间:2023-12-04 13:33:02 26 4
gpt4 key购买 nike

我有以下 Fortran 代码:

Program Strange
Real(Kind=8)::Pi1=3.1415926535897932384626433832795028841971693993751058209;
Real(Kind=8)::Pi2=3.1415926535897932384626433832795028841971693993751058209_8;

Print*, "Pi1=", Pi1;
Print*, "Pi2=", Pi2;

End Program Strange

我用 gfortran 编译,输出为:
 Pi1=   3.1415927410125732     
Pi2= 3.1415926535897931

当然第二个是正确的,但应该是这样吗?似乎 Pi1 作为单精度数字输入到内存,然后放入 double 内存插槽。但这对我来说似乎是一个错误。我对么?

最佳答案

我确实知道一点Fortran! @Dougal 的答案是正确的,尽管他引用的片段不是,嵌入了字母 d不需要转换成真正的文字常量(从 Fortran 90 开始),实际上许多 Fortran 程序员现在认为这种方法是过时的。该片段在建议使用 3.1415926535d+0 时也具有误导性。要为 pi 初始化一个 64 位浮点值,它没有将足够多的数字设置为正确的值。

该声明:

Real(Kind=8)::Pi1=3.1415926535897932384626433832795028841971693993751058209

定义 Pi1是类型 8 的实变量。字面实值 3.1415926535897932384626433832795028841971693993751058209然而,它是一个默认类型的实数,在大多数当前编译器上很可能是一个 4 字节实数。这似乎可以解释您的输出,但请检查您的文档。

另一方面,文字实际值 Pi2=3.1415926535897932384626433832795028841971693993751058209_8是,通过类型规范的后缀,声明为 kind=8,这与分配给它的变量的类型相同。

还有三点:

1) 不要落入认为 kind=8 的陷阱与 64-bit floating-point number 的意思相同或 double .对于许多编译器来说,它确实如此,而对于某些编译器却没有。种类编号在 Fortran 实现之间不可移植。根据标准,它们是任意正整数。更好的是,使用现代编译器,使用内部模块 iso_fortran_env 中的预定义常量。 ,例如
use, intrinsic :: iso_fortran_env
...
real(real64) :: pi = 3.14159265358979323846264338_real64

还有其他可移植的方法来使用函数设置变量种类,例如 selected_real_kind .

2) 由于 pi 的值在程序执行期间不太可能发生变化,您可能希望将其设为参数,因此:
real(real64), parameter :: pi = 3.14159265358979323846264338_real64

3) 没有必要(或通常)以“;”结束 Fortran 语句除非您想在源文件的同一行中包含多个语句。

关于fortran - Fortran 95 : 中的数值精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16370206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com