我正在做一些浮点运算并遇到精度问题。对于相同的输入,两台机器上的结果值是不同的。我读了帖子@ 为什么我不能乘以浮点数? 还阅读了网络上的其他材料并了解它与浮点的二进制表示和机器上的 epsilon 有关。但是,我想检查是否有办法解决这个问题/C++ 中浮点算术的一些解决方法?我正在将浮点数转换为无符号短整型以进行存储,并在必要时转换回来。但是,当我将其转换回无符号短整型时,精度(精确到小数点后 6 位)在一台机器上保持正确,但在另一台机器上失败。

//convert FLOAT to short

unsigned short sConst = 0xFFFF;

unsigned short shortValue = (unsigned short)(floatValue * sConst);

//Convert SHORT to FLOAT

float floatValue = ((float)shortValue / sConst);
有帮助吗?

解决方案

A short 必须至少为 16 位,并且在很多实现中正是如此。一个 unsigned 16位 short 将保存 0 到 65535 之间的值。这意味着 Short 无法保持完整的五位数字精度,当然也不能保持六位数字。如果需要 6 位数字,则需要 20 位。

因此,任何精度损失都可能是由于您尝试将六位数的精度压缩为小于五位数的结果。除了使用可能占用与 float.

我不知道为什么它似乎可以在一个给定的系统上运行。您在两者上使用相同的数字吗?是否使用了较旧的浮点系统,并且该系统恰好在您尝试的样本上给出了您期望的结果?是否可能使用更大的 short 比另一个?

其他提示

如果您要使用本机浮点类型,你能做的最好的是断言输出的值由您的程序不会从一组参考值相差太大。

的“过多”的精确定义完全取决于应用程序。例如,如果你在不同的平台计算a + b,你会发现这两个结果被对方的机器精度内。在另一方面,如果你正在做一些复杂的东西矩阵求逆,结果会比机器精度更极有可能是不同的。精确的确定,你可以期望多么接近的结果是对方是一个非常微妙和复杂的过程。除非你知道自己在做什么,它可能是安全的(且理智的)来确定的精确度,你需要在你的应用程序下游的金额,并验证结果不够精确。

要得到关于如何计算相对误差两个浮点值之间稳健地,看到此答案和浮点引导连接在其中一个想法:

浮点比较函数为C#

取代使用为0xFFFF使用它的一半,即32768转换。 32768(Ox8000)具有千万亿二进制表示而OXFFFF具有1111111111111111. Ox8000的二进制表示清晰表示的二进制表示,转换过程中的乘法及记名表决操作(短(或),而转换回浮动)不会改变精度值零点之后。对于一个侧转换,然而OXFFFF是优选的,因为它会导致更准确的结果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top