13

浮点算术(IEEE754,以防出现混淆)有哪些好的做法和不应该做的事情,以确保您的结果具有良好的数值稳定性和高精度?

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

4

7 回答 7

12

首先,输入浮点数不一定遵循与实数相同的规则......一旦你接受了这一点,你就会明白大部分的陷阱。

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

  • 永远不要将浮点数与零或其他任何东西进行比较(IE不要这样做:if (myFloat == 0)
  • 关联属性不适用于浮点...含义(a + b) + c != a + (b + c)
  • 请记住,总有四舍五入
  • 浮点数不一定有唯一的倒数
  • 没有浮点数的闭包......永远不要假设浮点运算的结果会产生有效的浮点数。
  • 分配财产不持有
  • 尽量避免使用浮点比较...因为舍入错误会导致意外结果
于 2010-06-23T14:46:36.630 回答
5

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

不要在整数就足够的情况下使用浮点数。

于 2010-06-23T14:52:12.947 回答
5

请务必了解浮点的行为方式。

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

例如,至少有两个答案建议禁止比较浮点是否相等。首先,在某些情况下,需要比较它们是否相等。然后,当需要进行范围检查时,您还需要意识到它有其缺陷,例如它不是传递性的,这是大多数人在相等性测试中会假设的属性。

于 2010-06-23T15:14:29.737 回答
4

请记住,由于浮点运算错误,人们死亡并造成数十亿美元的损失

于 2010-06-23T16:05:36.420 回答
0

永远不要尝试进行相等比较

双达,分贝;

...

如果 (da==db) 那么什么。

请记住,C 默认使用双精度,所以如果你想做单精度,请清楚这一点

浮动 fa,fb;

...

fa = fb + 1.0;

将 fb 转换为 double 做一个 double add 然后转换为 single 并做一个等于

反而

fa = fb + 1.0F。

都是单身。

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

fa = fb + 1;

或代替

fa = fb + 0.3333333F;

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

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

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

于 2010-06-23T14:44:51.720 回答
0

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

于 2010-06-25T10:50:02.503 回答
-1

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

于 2010-06-23T15:12:21.383 回答