改变精度时正确形式的数字

时间:2018-05-22 14:51:56

标签: floating-point fortran gfortran floating-accuracy

假设我有一些变量为双精度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

1 个答案:

答案 0 :(得分:1)

具有您称之为“垃圾”的那个具有double值中最少的信息丢失。

当384.6433096437924转换为双精度浮点时,结果是基于二进制格式的值,该值与原始值不同。如果您知道原始值有16位有效十进制数字,那么打印带有16位十进制数字的double可以产生原始值(在大多数情况下),这是有道理的。

但是,如果数字已通过各种计算,并且没有理由相信它代表具有一定精确十进制数字的数字,则截断或更改其显示值不会提供任何有用信息。它可能使人们更容易阅读,但整个计算值是我们对结果的最佳信息,因此打印整个值可以传达最多的信息。

或者,如果原始数字可以直接转换为四倍精度而不经过双精度,那么转换时的误差通常会更小,这种方法应该是首选。

最终,哪种形式最适合显示取决于显示的目的。您想保留最多信息以备将来使用吗?或者你想让结果易于人类阅读?

最后,你展示的“垃圾”很奇怪。将384.6433096437924转换为IEEE-754基本64位二进制浮点的结果应该是384.64330964379240640482748858630657196044921875,但是显示384.64330964379240681882947683334351。我不明白这个价值是如何产生的。