关于在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,然后改变精度,或类似的东西?
答案 0 :(得分:3)
让我们来看看对y的赋值。它是一个单精度变量,您可以为其指定单精度值。十进制值转换为使用的浮点表示,在大多数平台上是IEEE单精度,二进制浮点类型。这有23位的分数,8位指数和一个符号位。因为2.2在二进制浮点中不能完全表示,所以得到最接近(希望)可表示的值。
当你打印到更多地方时,那些“其他数字”是转换为十进制的单精度值 - 因为它不是精确的十进制数,它往往有额外的非零数字。有些实现会给你一个合理数量的附加数字,有些可能会在一段时间后开始给你零,有些可能只是给出随机数字。
2.125在二进制浮点中是完全可表示的,因此可以在两个方向上精确转换。