将弧度转换为度时,精度会下降

时间:2020-07-02 20:25:32

标签: c++

我的弧度值是双精度数据类型x

x = 0.423438990337458964763328594926861114799976348876953125;

在将此值转换为度然后重新转换为弧度时,我希望计算机为我提供相同的x值,而不会损失精度。

我正在qRadiansToDegrees中使用qt方法,这似乎很完美,但是在尝试访问x的值时仍然会失去精度。

如果这是可以解决的,请问有人如何防止这种情况发生?如果不是,是否还有另一种表示doubles的方式,以使它们在转换后不会失去精度?

2 个答案:

答案 0 :(得分:7)

在计算中,double可以容纳53个二进制有效数字,在我们使用的十进制系统中,可以转换为math.log(2**53, 10)〜= 15个有效数字

因此,您不能期望0.423438990337458964763328594926861114799976348876953125(具有54个有效数字)被准确表示。

如果您确实需要这种精度,那么可以使用单独的库来处理高精度数字。但是,这些速度较慢,可能没有必要。

答案 1 :(得分:0)

x = 0.423438990337458964763328594926861114799976348876953125

该特定值恰好可以精确表示为IEEE-754 double (1)。我们可以通过一点snippet来找到它附近的邻居。

0.4234389903374589092521773636690340936183929443359375
0.423438990337458964763328594926861114799976348876953125
0.42343899033745902027447982618468813598155975341796875

请注意,像0.423438990337459这样的值不是 可以由double精确表示,并且将由其中之一进行内部近似(2) 。另请注意,它们的相对“距离”约为10 -16

通常,始终可以获取基数为2的浮点值的精确的以10为底的表示形式(可能有很大的十进制数字,但数量有限)。通常不可能取反(您需要无限个位数代表0.1)。我怀疑OP是通过使用调试器检查特定的double来获得此值的。

当将此值转换为度然后重新转换为弧度时,我希望计算机在不损失精度的情况下为我提供相同的x值。

我不知道如何在Qt中实现qRadiansToDegrees,也不知道OP正在使用什么体系结构,但是当我尝试这种往返的可能实现时,我很幸运(见)。例如第一个结果here)。

考虑到floating point multiplication is not even associative,恐怕一般来说您应该降低期望值。

Here我尝试用随机角度测试失败的百分比。在那种测试环境中大约占25%。


1)C ++标准没有强制使用IEEE-754标准来表示浮点值。但是,此答案的要点是,任何固定大小的表示形式都无法保证OP期望的结果。

2)某些体系结构可以为寄存器提供更宽的精度(例如80位),因此一般而言中间结果和计算可以更准确。这只是一个例子。

相关问题