代码指定的双精度和编译器选项双精度之间的差异

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码指定的双精度和编译器选项双精度之间的差异相关的知识,希望对你有一定的参考价值。

编写Fortran代码时,通过分配kind=8double precision来声明实变量是确保双精度的一种方法。另一种方法是不在代码中明确声明任何内容,而是使用编译器选项,即-r8(ifort)等。

这两者有区别吗?

答案

仔细阅读这一点,虽然它不是100%重复:Fortran: integer*4 vs integer(4) vs integer(kind=4)Fortran 90 kind parameter

kind=8是不可移植的,不会在某些编译器中工作并向初学者教授,即使在一个Coursera课程中也可以看到它应该受到刑事起诉。

有不同的编译器选项具有不同的效果。 Ones将所有4字节实数或整数提升为8字节实数。其他设置默认类型为8.这打破了一些关于存储的标准假设,并且double precision能够容纳超过默认类型。例如在gfortran中:

-fdefault-real-8

将默认实数设置为8字节实数。这与以下内容并不完全相同:

-freal-4-real-8

它将所有4字节实数提升为8字节。您必须小心了解差异,通常使用这些选项并不是一个很好的做法。

使用命名常量,建议的解决方案始终相同:

integer, parameter :: rp = ...

并始终使用

real(rp) :: x

你可以拥有更多这些常量。根据引用的问题(real64kind(1.d0)selected_real_kind(...))设置常量的值。

以上是关于代码指定的双精度和编译器选项双精度之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中将十进制数转换为双精度数会产生差异

Java - Decimal Format.parse 返回具有指定小数位数的双精度值

字符串中的双精度或整数?

PInvoke:返回的双精度数组有问题吗?

如何在android中添加两个没有指数的双精度值

有没有更有效的方法将 4 个连续的双精度广播到 4 个 YMM 寄存器中?