Floating point 在Fortran90中,将较低精度的数字指定给较高精度的数字
关于在Fortran90中指定文字的几个问题。使用gfortran 4.6 节目:Floating point 在Fortran90中,将较低精度的数字指定给较高精度的数字,floating-point,fortran,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 '(F2
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
literal2.2
被分配到更高的精度,kind=RP
realx
时,它们似乎是相同的。那么,是将文字转换为基数2,然后再更改精度,还是诸如此类的事情呢?让我们看看对y的赋值。它是一个单精度变量,您可以为其指定一个精度值。十进制值转换为所使用的浮点表示形式,在大多数平台上是IEEE单精度,一种二进制浮点类型。它有23位分数、8位指数和一个符号位。因为2.2在二进制浮点中不完全可表示,所以可以得到最接近(希望)的可表示值
当您打印到更多位置时,这些“其他数字”是转换为十进制的单精度值-因为它在十进制中不精确,所以往往会有额外的非零数字。有些实现会为您提供合理数量的附加数字,有些可能会在一段时间后开始为您提供零,有些可能只提供随机数字
2.125完全可以用二进制浮点表示,因此它可以在两个方向上进行精确转换。让我们看看y的赋值。它是一个单精度变量,您可以为其指定一个精度值。十进制值转换为所使用的浮点表示形式,在大多数平台上是IEEE单精度,一种二进制浮点类型。它有23位分数、8位指数和一个符号位。因为2.2在二进制浮点中不完全可表示,所以可以得到最接近(希望)的可表示值 当您打印到更多位置时,这些“其他数字”是转换为十进制的单精度值-因为它在十进制中不精确,所以往往会有额外的非零数字。有些实现会为您提供合理数量的附加数字,有些可能会在一段时间后开始为您提供零,有些可能只提供随机数字
2.125完全可以用二进制浮点表示,因此它可以在两个方向上进行精确转换。让我们看看y的赋值。它是一个单精度变量,您可以为其指定一个精度值。十进制值转换为所使用的浮点表示形式,在大多数平台上是IEEE单精度,一种二进制浮点类型。它有23位分数、8位指数和一个符号位。因为2.2在二进制浮点中不完全可表示,所以可以得到最接近(希望)的可表示值 当您打印到更多位置时,这些“其他数字”是转换为十进制的单精度值-因为它在十进制中不精确,所以往往会有额外的非零数字。有些实现会为您提供合理数量的附加数字,有些可能会在一段时间后开始为您提供零,有些可能只提供随机数字
2.125完全可以用二进制浮点表示,因此它可以在两个方向上进行精确转换。让我们看看y的赋值。它是一个单精度变量,您可以为其指定一个精度值。十进制值转换为所使用的浮点表示形式,在大多数平台上是IEEE单精度,一种二进制浮点类型。它有23位分数、8位指数和一个符号位。因为2.2在二进制浮点中不完全可表示,所以可以得到最接近(希望)的可表示值 当您打印到更多位置时,这些“其他数字”是转换为十进制的单精度值-因为它在十进制中不精确,所以往往会有额外的非零数字。有些实现会为您提供合理数量的附加数字,有些可能会在一段时间后开始为您提供零,有些可能只提供随机数字
2.125完全可以用二进制浮点表示,因此它可以在两个方向上进行精确转换。相关问题:也相关:注意,在本例中,“额外的”
2031250
不是随机数字。这是通过采用单精度二进制表示并在二进制中用零填充以获得更高精度的值。(它正好是9227469/4194304
)与2.2最接近的32位IEEE 754二进制浮点是2.2000000476837158203125。最接近的64位是2.200000000000000017763568394002504646778106689453125。相关问题:也相关:注意,在本例中,“额外的”2031250
不是随机数字。这是通过采用单精度二进制表示并在二进制中用零填充以获得更高精度的值。(它正好是9227469/4194304
)与2.2最接近的32位IEEE 754二进制浮点是2.2000000476837158203125。最接近的64位是2.200000000000000017763568394002504646778106689453125。相关问题:也相关:注意,在本例中,“额外的”2031250
不是随机数字。这是通过采用单精度二进制表示并在二进制中用零填充以获得更高精度的值。(它正好是9227469/4194304
)与2.2最接近的32位IEEE 754二进制浮点是2.2000000476837158203125。最接近的64位是2.200000000000000017763568394002504646778106689453125。相关问题:也相关:注意,在本例中,“额外的”2031250
不是随机数字。这是通过采用单精度二进制表示法和pad得到的值