C++ C+中的浮点算术问题有解决方案吗+;?
我正在做一些浮点运算,并且有精度问题。对于相同的输入,两台机器上的结果值不同。我读了帖子@,也在网上读了其他材料&我知道这与浮点和机器epsilon的二进制表示有关。但是,我想检查是否有办法解决这个问题/一些工作围绕浮点运算在C++?我正在将一个浮点数转换为无符号的存储缩写,并在必要时转换回。但是,当我将其转换回unsigned short时,精度(到6个小数点)在一台机器上保持正确,但在另一台机器上失败C++ C+中的浮点算术问题有解决方案吗+;?,c++,floating-point,precision,multiplication,epsilon,C++,Floating Point,Precision,Multiplication,Epsilon,我正在做一些浮点运算,并且有精度问题。对于相同的输入,两台机器上的结果值不同。我读了帖子@,也在网上读了其他材料&我知道这与浮点和机器epsilon的二进制表示有关。但是,我想检查是否有办法解决这个问题/一些工作围绕浮点运算在C++?我正在将一个浮点数转换为无符号的存储缩写,并在必要时转换回。但是,当我将其转换回unsigned short时,精度(到6个小数点)在一台机器上保持正确,但在另一台机器上失败 //convert FLOAT to short unsigned short sCon
//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+b
,您应该会发现这两个结果彼此在机器精度范围内。另一方面,如果你正在做一些更复杂的事情,比如矩阵求逆,结果很可能会相差超过机器精度。确定结果之间的精确距离是一个非常微妙和复杂的过程。除非您确切知道自己在做什么,否则确定应用程序下游所需的精度并验证结果是否足够精确可能更安全(也更明智)
要了解如何可靠地计算两个浮点值之间的相对误差,请参阅此答案和其中链接的浮点指南:
如果要使用本机浮点类型,最好是声明程序输出的值与一组参考值之间没有太大差异 “太多”的精确定义完全取决于您的应用程序。例如,如果您在不同的平台上计算
a+b
,您应该会发现这两个结果彼此在机器精度范围内。另一方面,如果你正在做一些更复杂的事情,比如矩阵求逆,结果很可能会相差超过机器精度。确定结果之间的精确距离是一个非常微妙和复杂的过程。除非您确切知道自己在做什么,否则确定应用程序下游所需的精度并验证结果是否足够精确可能更安全(也更明智)
要了解如何可靠地计算两个浮点值之间的相对误差,请参阅此答案和其中链接的浮点指南:
A
short
必须至少为16位,在很多实现中,这就是它的确切含义。无符号的16位short
将保存0到65535之间的值。这意味着一个短字符不能容纳完整的五位数精度,当然也不能容纳六位数精度。如果你想要六位数,你需要20位
因此,任何精度损失都可能是因为您试图将六位数的精度压缩为小于五位数的值。除了使用一个可能与浮点数
占用同样多存储空间的整型之外,没有其他解决方案
我不知道为什么它会在一个给定的系统上工作。你在这两个上面用的号码是一样的吗?其中一个使用的是较旧的浮点系统,而另一个恰好在您尝试的样本上给出了您期望的结果?它可能使用比另一个更大的short
吗?一个short
必须至少是16位,并且在很多实现中都是这样。无符号的16位short
将保存0到65535之间的值。这意味着一个短字符不能容纳完整的五位数精度,当然也不能容纳六位数精度。如果你想要六位数,你需要20位
因此,任何精度损失都可能是因为您试图将六位数的精度压缩为小于五位数的值。除了使用一个可能与浮点数
占用同样多存储空间的整型之外,没有其他解决方案
我不知道为什么它会在一个给定的系统上工作。你在这两个上面用的号码是一样的吗?其中一个使用的是较旧的浮点系统,而另一个恰好在您尝试的样本上给出了您期望的结果?它是否可能使用比另一个大的短的?而不是使用0xFFFF,使用它的一半,即32768进行转换。32768(Ox8000)的二进制表示形式为1000000000000,而OXFFF的二进制表示形式为1111111。Ox8000的二进制表示法清楚地表明,转换过程中的乘法和除法运算(转换回浮点时变短(或))不会改变零后的精度值。然而,对于单侧转换,OxFFFF更可取,因为它会导致更精确的结果 不使用0xFFFF,而是使用它的一半,即32768进行转换。32768(Ox8000)的二进制表示形式为1000000000000,而OXFFF的二进制表示形式为1111111。Ox8000的二进制表示法清楚地表明,转换过程中的乘法和除法运算(转换回浮点时变短(或))不会改变零后的精度值。然而,对于单侧转换,OxFFFF更可取,因为它会导致更精确的结果 到底是什么问题?两台不同机器上的乘法结果略有不同这一事实本身并不是问题。