C ++中是否存在浮点算术问题的解决方案?

时间:2010-10-28 14:44:43

标签: c++ floating-point precision multiplication epsilon

我正在做一些浮点运算并且存在精度问题。对于相同的输入,两台机器上的结果值不同。我阅读了@ Why can't I multiply a float?的帖子,还阅读了网络上的其他资料。理解它与浮点的二进制表示和机器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);

4 个答案:

答案 0 :(得分:2)

short必须至少为16位,并且在很多实现中都与它完全相同。 unsigned 16位short将保持0到65535之间的值。这意味着short不会保持完整的五位数精度,当然也不会是六位。如果你想要六位数,你需要20位。

因此,任何精度损失都可能是由于您试图将六位精度打包成小于五位的精度。除了使用可能需要float的存储空间的整数类型之外,没有解决方法。

我不知道为什么它似乎适用于一个给定的系统。你们两个都使用相同的数字吗?是否有人使用较旧的浮点系统,并且巧合地给出了您尝试过的样本所期望的结果?是否可能使用比另一个更大的short

答案 1 :(得分:1)

如果要使用本机浮点类型,最好的办法是断言程序输出的值与一组参考值的差别不大。

“太多”的精确定义完全取决于您的应用。例如,如果在不同平台上计算a + b,则应该发现两个结果在彼此的机器精度范围内。另一方面,如果你正在做一些比矩阵求逆更复杂的事情,结果很可能会超过机器精度。确切地确定结果彼此之间的接近程度是一个非常微妙和复杂的过程。除非您确切知道自己在做什么,否则在您的应用程序中确定下游所需的精度数量并确认结果足够精确可能更安全(更安全)。

要了解如何稳健地计算两个浮点值之间的相对误差,请参阅此答案以及其中链接的浮点指南:

Floating point comparison functions for C#

答案 2 :(得分:0)

答案 3 :(得分:0)

而不是使用0xFFFF使用它的一半,即32768用于转换。 32768(Ox8000)具有1000000000000000的二进制表示,而OxFFFF具有1111111111111111的二进制表示.Ox8000的二进制表示清楚地暗示,乘法&转换期间的divsion操作(转换回float时为short(或))不会在零之后更改精度值。对于一侧转换,但优选OxFFFF,因为它导致更准确的结果。