在Fortran90中为精度分配较低的精度

时间:2014-09-07 23:03:29

标签: floating-point fortran

关于在Fortran90中分配文字的几个问题。使用gfortran 4.6。

程序:

program scratch
  implicit none
  integer, parameter :: RP = selected_real_kind(15)
  real(kind=RP) :: w,x,z
  real :: y

  w=2.2_RP
  x=2.2
  y=2.2
  z=2.125

  print*, w
  print*, x
  print*, y
  print '(F25.23)', y
  print*, z
end program scratch

输出:

   2.2000000000000002     
   2.2000000476837158     
   2.20000005    
   2.20000004768371582031250
   2.1250000000000000  

对于每个打印输出,我想了解编译器/处理器正在做什么。例如。 y显示小数点后7位数,但如果我们格式化输出,这些其他数字来自哪里?它们看起来与默认情况下相同 - real文字2.2分配给更高精度kind=RP真实x。那么文字被转换为基数2,然后改变精度,或类似的东西?

1 个答案:

答案 0 :(得分:3)

让我们来看看对y的赋值。它是一个单精度变量,您可以为其指定单精度值。十进制值转换为使用的浮点表示,在大多数平台上是IEEE单精度,二进制浮点类型。这有23位的分数,8位指数和一个符号位。因为2.2在二进制浮点中不能完全表示,所以得到最接近(希望)可表示的值。

当你打印到更多地方时,那些“其他数字”是转换为十进制的单精度值 - 因为它不是精确的十进制数,它往往有额外的非零数字。有些实现会给你一个合理数量的附加数字,有些可能会在一段时间后开始给你零,有些可能只是给出随机数字。

2.125在二进制浮点中是完全可表示的,因此可以在两个方向上精确转换。