0

我正在做一些浮点运算并且有精度问题。对于相同的输入,两台机器上的结果值不同。我读了帖子@为什么我不能乘以浮点数?并阅读网络上的其他材料并了解它与浮点的二进制表示和机器ε有关。但是,我想检查是否有办法解决这个问题/C++ 中浮点运算的一些解决方法??我正在将一个浮点数转换为无符号短存储,并在必要时转换回来。但是,当我将其转换回 unsigned short 时,精度(到小数点后 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

4 回答 4

2

Ashort必须至少为 16 位,并且在许多实现中,这正是它的本质。一个unsigned16 位short将保存从 0 到 65535 的值。这意味着一个 short 不会保存完整的五位精度,当然也不是六位。如果你想要六位数字,你需要 20 位。

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

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

于 2010-10-28T17:02:09.730 回答
1

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

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

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

C# 的浮点比较函数

于 2010-10-28T15:07:50.430 回答
0

您是否正在寻找这样的标准:

Programming Languages C++ - 关于编程语言 C++ 扩展的类型 2 技术报告以支持十进制浮点算术草案

于 2010-10-28T14:52:35.763 回答
0

而不是使用 0xFFFF 使用它的一半,即 32768 进行转换。32768 (Ox8000) 具有 1000000000000000 的二进制表示,而 OxFFFF 具有 1111111111111111 的二进制表示。 Ox8000 的二进制表示清楚地表明,转换期间的乘法和除法运算(在转换回浮点数时转换为短(或))不会改变精度值零后。然而,对于一侧转换,OxFFFF 更可取,因为它会导致更准确的结果。

于 2011-12-17T09:49:07.877 回答