首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用英特尔11.1编译器在fortran 90中实现双精度

使用英特尔11.1编译器在fortran 90中实现双精度
EN

Stack Overflow用户
提问于 2011-03-11 01:06:18
回答 4查看 7.8K关注 0票数 3

我有一个很大的代码,用fortran写的,用来建立和迭代求解非线性偏微分方程组。我需要所有的变量都是双精度的。在我为代码编写的附加模块中,我将所有变量声明为双精度类型,但我的模块仍然使用旧源代码中声明为real类型的变量。所以我的问题是,在fortran中,单精度变量乘以双精度变量会发生什么?如果用于存储值的变量被声明为双精度,那么结果是双精度吗?如果一个双精度的值乘以一个在末尾没有"D0“的常量,该怎么办?我是否可以在英特尔11.1中设置一个编译器选项,使所有实数/双精度/常量成为双精度?

EN

回答 4

Stack Overflow用户

发布于 2011-03-11 08:09:35

所以我的问题是,在fortran中,单精度变量乘以双精度变量会发生什么?将单精度提升为双精度,并在双精度下进行运算。

如果用于存储值的变量被声明为双精度,那么结果是双精度吗?不一定。右边是一个表达式,它不“知道”左边变量的精度,它将被存储在其中。如果使用Double = SingleA * SingleB (使用名称表示类型),则计算将以单精度执行,然后转换为double进行存储。这将不会获得额外的计算精度!

如果一个双精度的值乘以一个在末尾没有"D0“的常量,该怎么办?这就像第一个问题一样,常量将被提升为双精度,计算将以双精度进行。然而,,常量仍然是单精度的,即使你写下许多位数作为双精度常量,内部存储器也是单精度的,不能表示该精度。例如,DoubleVar * 3.14159265359将以双精度计算,但将近似于DoubleVar * 3.14159以双精度计算。

如果要让编译器保留常量中的多位数,则必须指定常量的精度。Fortran 90的方法是使用所需的精度定义您自己的实型,例如,至少需要14位十进制数字:

代码语言:javascript
复制
integer, parameter :: DoubleReal_K = selected_real_kind (14)
real (DoubleReal_K) :: A
A = 5.0_DoubleReal_K
A = A * 3.14159265359_DoubleReal_K
票数 4
EN

Stack Overflow用户

发布于 2011-03-11 02:07:26

Fortran标准对此非常具体;其他语言也是如此,这确实是您所期望的。如果表达式包含对两个精度不同的浮点变量的操作,则该表达式属于较高精度的操作数类型。例如,

(实数变量)+(双精度变量) -> (双精度)

(双精度变量)*(实数变量) -> (双精度)

(double变量)*(实常量) -> (double)

等。

现在,如果您将结果存储在较低精度的浮点变量中,它将再次被向下转换。但是如果你把它存储在一个更高精度的变量中,它会保持它的精度。

如果您担心单精度浮点变量会导致问题,可以使用DBLE()内部函数将其强制转换为双精度:

DBLE(实数变量) ->双精度

票数 3
EN

Stack Overflow用户

发布于 2012-11-03 00:47:09

如果您以0.1D0的形式写入数字,它会将其视为双精度数字,否则,如果您写入0.1,精度将在转换中丢失。下面是一个示例:

代码语言:javascript
复制
program main
implicit none
real(8) a,b,c
a=0.2D0
b=0.2
c=0.1*a
print *,a,b,c
end program

在使用

代码语言:javascript
复制
ifort main.f90

我得到的结果是:

代码语言:javascript
复制
0.200000000000000       0.200000002980232       2.000000029802322E-002

在使用

代码语言:javascript
复制
ifort -r8 main.f90

我得到的结果是:

代码语言:javascript
复制
0.200000000000000       0.200000000000000       2.000000000000000E-002

如果使用IBM XLF编译器,等价性为

代码语言:javascript
复制
xlf -qautodbl=dbl4 main.f90
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5263157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档