当前位置: 首页 > 编程笔记 >

Fortran 浮点数精度

段哲圣
2023-03-14
本文向大家介绍Fortran 浮点数精度,包括了Fortran 浮点数精度的使用技巧和注意事项,需要的朋友参考一下

示例

类型的浮点数real不能有任何实数值。它们可以表示实数,最多可以包含一定数量的十进制数字。

FORTRAN 77保证了两种浮点类型,而最新的标准则至少保证了两种实数类型。实变量可以声明为

real x
double precision y

x这是默认类型的实数,并且y是比更大的十进制精度的实数x。在Fortran 2008中,十进制精度y至少为10,其十进制指数范围至少为37。

 real, parameter             :: single = 1.12345678901234567890
 double precision, parameter :: double = 1.12345678901234567890d0
 
 print *, single
 print *, double

版画

   1.12345684    
   1.1234567890123457

在使用默认配置的常见编译器中。

注意d0双精度常量中的。包含d而不是e用于表示指数的实数文字用于表示双精度。

! Default single precision constant
1.23e45
! Double precision constant
1.23d45

Fortran 90引入了real使用种类的参数化类型。实类型的种类是一个名为常量或文字常量的整数:

real(kind=real_kind) :: x

要不就

real(real_kind) :: x

该语句声明x为real具有一定精度的类型,具体取决于的值real_kind。

浮点文字可以使用后缀声明为特定种类

1.23456e78_real_kind

的确切值real_kind未标准化,并且因编译器而异。要查询任何实变量或常量的种类,kind()可以使用以下函数:

print *, kind(1.0), kind(1.d0)

通常会打印

4 8

要么

1 2

取决于编译器。

可以通过几种方式设置种类编号:

  1. 单精度(默认)和双精度:

    integer, parameter :: single_kind = kind(1.)
    integer, parameter :: double_kind = kind(1.d0)
  2. 使用内在函数selected_real_kind([p, r])指定所需的十进制精度。返回的种类的精度至少p为数位,并且指数至少为r。

    integer, parameter :: single_kind = selected_real_kind( p=6, r=37 )
    integer, parameter :: double_kind = selected_real_kind( p=15, r=200 )
  3. 与2003年的Fortran开始,预先定义的常量都可以通过固有的模块ISO_C_Binding,以确保真正的品种是可互操作的同类型float,double或long_double伴随的C编译器:

    use ISO_C_Binding
    integer, parameter :: single_kind = c_float
    integer, parameter :: double_kind = c_double
    integer, parameter :: long_kind = c_long_double
  4. 从Fortran 2008开始,可以通过内部模块使用预定义的常量ISO_Fortran_env。这些常数以位为单位提供具有一定html" target="_blank">存储大小的实数

    use ISO_Fortran_env
    integer, parameter :: single_kind = real32
    integer, parameter :: double_kind = real64
    integer, parameter :: quadruple_kind = real128

如果编译器中无法提供某种类型,则返回selected_real_kind()的值或整数常量的值为-1。

 类似资料:
  • 问题内容: $a = ‘35’; $b = ‘-34.99’; echo ($a + $b); 结果为0.009999999999998 这是怎么回事?我想知道为什么我的程序不断报告奇怪的结果。 为什么PHP不返回预期的0.01? 问题答案: 因为浮点运算!=实数运算。对于一些浮子和,由不精确性引起的差异的说明是。这适用于使用浮点数的任何语言。 由于浮点数是具有有限精度的二进制数,因此存在有限数量

  • 我编写了一个程序来演示Go中的浮点错误: 它打印: 这与用C编写的相同程序的行为相匹配(使用双代码类型) 但是,如果改用,程序就会陷入无限循环!如果将C程序修改为使用而不是,它将打印 为什么在使用时,Go程序的输出与C程序的输出不一样?

  • 问题内容: 我正在读取一个带有浮点数的文本文件,这些数字都带有1或2个小数点。我正在使用将线转换为浮点数,并在失败的情况下引发。我将所有花车存储在列表中。打印时,我想将其打印为2个小数位的浮点数。 假设我有一个文本文件,其编号为-3,65、9,17、1。我阅读了每个文件,然后将它们转换为float并将它们附加到列表中。现在在Python 2中,调用return 。但是在Python 3中,-3.6

  • 在我的计算机科学课程中,我们正在研究浮点数以及它们在内存中是如何表示的。我已经理解了它们在内存中是如何表示的(尾数/有效数、指数及其偏差、符号位),我也理解了浮点是如何相互添加和减去的(反规格化和所有那些有趣的东西)。然而,在翻阅一些学习问题时,我注意到一些我无法解释的东西。 当一个不能精确表示的浮点数加到自己身上几次时,答案比我们在数学上预期的要低,但当同一个浮点数乘以一个整数时,答案就精确地得

  • 问题内容: 如果我们运行以下代码: 它打印: 文字1.2345678990922222中的长尾将被忽略,但1.22222222222222222222中的长尾不会被忽略(变量d中的最后一个十进制数字变为3而不是2)。为什么? 问题答案: 打印a 或a 时看到的位数是Java的默认规则(从和转换为十进制)的结果。 Java的浮点数默认格式使用最少的有效十进制数字来将数字与附近的可表示数字区分开。1个