Do-s和DO-for浮点运算?

时间:2010-06-23 14:35:21

标签: c floating-point ieee-754

为了确保良好的数值稳定性和结果的高精度,浮点运算(IEEE754,如果存在混淆)有什么好处和不做什么?

我知道有些人不喜欢减去相似数量的数量,但我很好奇其他有什么好的规则。

7 个答案:

答案 0 :(得分:12)

首先,输入浮点数 NOT 的概念必须遵循与实数相同的规则......一旦你接受了这个,你就会理解大部分的陷阱。

以下是我一直遵循的一些规则/提示:

  • 永远不要将浮点数与零或其他任何内容进行比较(IE不这样做:if (myFloat == 0)
  • 关联属性不适用于浮点...意味着(a + b) + c != a + (b + c)
  • 请记住,总有四舍五入
  • 浮点数不一定具有唯一的逆
  • 没有带浮点数的闭包......永远不要假设浮点运算的结果会产生有效的浮点数。
  • 分配财产不成立
  • 尽量避免使用浮点数比较...因为舍入错误会导致意外结果

答案 1 :(得分:5)

带浮点数的#1“不”规则是:

不要使用整数就足够的浮点数。

答案 2 :(得分:5)

了解浮点的行为。

不要相信简单的规则足以正确使用它们。

例如,至少有两个答案提出应该禁止比较浮点的平等性。首先,有些情况下需要比较它们的平等性。然后,当进行范围检查是需要的时候,你还需要意识到它有它的缺陷,例如它不是传递性的,这是大多数人将为相等性测试所假设的属性。

答案 3 :(得分:3)

请记住,因为错误的浮点运算people died 和数十亿美元的damages发生了。

答案 4 :(得分:0)

永远不要尝试做等于比较

double da,db;

...

if(da == db)then something。

请记住,C默认使用double,所以如果你想做单精度,请明确它

float fa,fb;

...

fa = fb + 1.0;

将fb转换为double执行双重添加然后转换为单个并执行单个等于

相反

fa = fb + 1.0F。

全部单身。

如果您要使用像1.0这样的整数,请不要在代码中使用小数。如果可以最小化ascii数字,您可以从编译器/工具中获得更高的可靠性。所以

fa = fb + 1;

或代替

fa = fb + 0.3333333F;

做这样的事情(如果对准确性感兴趣)。

fc = 1; fc = fc / 3; fa = fb + fc;

很多其他人,浮点数很痛苦,编译器和库不是那么好,fpus有错误,IEEE非常痛苦并导致更多错误。不幸的是,这是我们在大多数平台上生活的世界。

答案 5 :(得分:0)

我避免浮点陷阱的“主要武器”是牢牢掌握其工作方式。我认为Chris Hecker很好地解释了基础知识。

答案 6 :(得分:-1)

搜索,下载和阅读 “每个计算机科学家都应该了解浮点运算”