Floating point 更改精度时数字的正确形式

Floating point 更改精度时数字的正确形式,floating-point,fortran,gfortran,floating-accuracy,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

假设我有一个从二进制文件读取的双精度变量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

您称之为“垃圾”的文件从
双值中丢失的信息最少

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

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

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

最终,哪种形式最适合显示取决于显示的目的。是否要保留最多的信息以供将来使用?或者你想让结果更容易被人阅读


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

这个值可能是因为文字
384.6433096437924
是单精度的。但也许OP的编译器使用double作为默认值。@VladimirF:Hmm,IEEE-754 32位会产生384.643310546875。但我不明白的是,
selected\u real\u kind(15307)
。我对IEEE-754相当了解,但多年来没有使用FORTRAN。在正常设置下执行OP代码后,我的结果确实是
384.64331054687500 384.643310546875000000000000000000000384.643309664379239999999999999999999999998
gfortran-fdefault-real-8
返回值
384.64330964379241 384.64330964379406404827488586306572 384.6433096437939999999998
@user1887919这是一个非常重要的信息,请编辑您的问题并按照我之前的要求添加。但是,正如你所看到的,我得到了一些不同的结果。请仔细检查所有内容,并发布准确的编译器选项、准确的代码和编译器版本。同样,正如我要求你做的那样。请检查你的代码是否准确,结果是否被准确复制,并告诉我们你的编译器选项。请参阅下面的讨论答案。你的结果很奇怪。另见