假设我有一些变量为双精度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
答案 0 :(得分:1)
具有您称之为“垃圾”的那个具有double
值中最少的信息丢失。
当384.6433096437924转换为双精度浮点时,结果是基于二进制格式的值,该值与原始值不同。如果您知道原始值有16位有效十进制数字,那么打印带有16位十进制数字的double
可以产生原始值(在大多数情况下),这是有道理的。
但是,如果数字已通过各种计算,并且没有理由相信它代表具有一定精确十进制数字的数字,则截断或更改其显示值不会提供任何有用信息。它可能使人们更容易阅读,但整个计算值是我们对结果的最佳信息,因此打印整个值可以传达最多的信息。
或者,如果原始数字可以直接转换为四倍精度而不经过双精度,那么转换时的误差通常会更小,这种方法应该是首选。
最终,哪种形式最适合显示取决于显示的目的。您想保留最多信息以备将来使用吗?或者你想让结果易于人类阅读?
最后,你展示的“垃圾”很奇怪。将384.6433096437924转换为IEEE-754基本64位二进制浮点的结果应该是384.64330964379240640482748858630657196044921875,但是显示384.64330964379240681882947683334351。我不明白这个价值是如何产生的。