繁体   English   中英

在C ++中有浮点算术问题的解决方案吗?

[英]Is there a solution for Floating point Arithmetic problems in C++?

我正在做一些浮点运算,并且有精度问题。 对于相同的输入,两台机器上的结果值不同。 我读了帖子@ 为什么我不能乘一个浮点数? 并且还阅读了网上的其他资料,并了解它与浮点数的二进制表示形式以及机器epsilon上的内容有关。 但是,我想检查是否有解决此问题的方法/ C ++中的浮点算术可以解决? 我正在将浮点数转换为存储的无符号缩写,并在必要时进行转换。 但是,当我将其转换回无符号的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);

short必须至少为16位,并且在很多实现中都是这样。 一个unsigned 16位short可以保存0到65535之间的值。这意味着short不能保存完整的5位精度,当然也不能容纳6位精度。 如果要六位数,则需要20位。

因此,任何精度损失都可能是由于您试图将六位数的精度打包成少于五位数的事实。 除了使用可能需要与float一样多的存储的整数类型外,没有其他解决方案。

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

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

“太多”的精确定义完全取决于您的应用程序。 例如,如果您在不同的平台上计算a + b ,则应发现两个结果在机器精度之间。 另一方面,如果您正在做一些更复杂的事情(例如矩阵求逆),那么结果的差异很可能会超过机器精度。 精确确定结果之间的距离是一个非常微妙而复杂的过程。 除非您确切地知道自己在做什么,否则确定应用程序下游所需的精确度并验证结果是否足够精确可能会更安全(更精明)。

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

C#的浮点比较功能

而不是使用0xFFFF,而是使用它的一半,即32768进行转换。 32768(Ox8000)的二进制表示形式为1000000000000000,而OxFFFF的二进制表示形式为1111111111111111。Ox8000的二进制表示形式明确表示,转换期间的乘法和除法运算(转换为short(或转换为float时))不会更改精度值零后。 对于单面转换,但是OxFFFF是优选的,因为它可以导致更准确的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM