假设我有一些从二进制文件中读取的双精度变量x。打印时,此变量 x = 384.6433096437924
我想把它"撞"到四精度。
integer, parameter :: qp = selected_real_kind(32,307)
integer, parameter :: dp = selected_real_kind(15,307)
real(kind=dp) :: x_double
real(kind=qp) :: x_quad
x_double = 384.6433096437924
x_quad = real(x_double, kind=dp)
print *, x_double, x_quad, 384.64330964379240_qp
这输出,
384.6433096437924, 384.64330964379240681882947683334351, 384.643309643792400000000000000000009
哪个四边形数字是"最好的"——即最准确、最一致等要使用的值?有"垃圾"的还是没有的?
我理解(我认为!(与计算机上浮点数的精确表示有关的问题,但看不出哪条路要走。
我编译为gfortran -fdefault-real-8
具有您所谓的"垃圾"的那个从double
值中丢失的信息最少。
当 384.6433096437924 转换为双精度浮点时,结果是基于二进制格式的值,并且该值与原始值不同。如果您知道原始值有 16 个有效的十进制数字,那么打印具有 16 个十进制数字的double
可以生成原始值(在大多数情况下(,这是有道理的。
但是,如果该数字经过各种计算,并且没有理由相信它代表具有一定精确数量的十进制数字的数字,那么截断或更改其值以进行显示不会提供任何有用的信息。它可能使人类更容易阅读,但整个计算值是我们掌握的关于结果的最佳信息,因此打印整个值传达的信息最多。
或者,如果原始数字可以直接转换为四精度而不经过双精度,那么转换的误差通常会更小,应该首选此方法。
最终,哪种形式最适合显示取决于显示的目的。您想保留最多的信息以备将来使用吗?还是您想让人类轻松阅读结果?
最后,你展示的"垃圾"很奇怪。将 384.6433096437924 转换为 IEEE-754 基本 64 位二进制浮点的结果应为 384.64330964379240640482748858630657196044921875,但显示 384.64330964379240681882947683334351。我不明白这种价值是如何产生的。