浮点算术(IEEE754,以防出现混淆)有哪些好的做法和不应该做的事情,以确保您的结果具有良好的数值稳定性和高精度?
我知道有些人不会减去类似数量的数量,但我很好奇还有什么其他好的规则。
浮点算术(IEEE754,以防出现混淆)有哪些好的做法和不应该做的事情,以确保您的结果具有良好的数值稳定性和高精度?
我知道有些人不会减去类似数量的数量,但我很好奇还有什么其他好的规则。
首先,输入浮点数不一定遵循与实数相同的规则......一旦你接受了这一点,你就会明白大部分的陷阱。
以下是我一直遵循的一些规则/提示:
if (myFloat == 0)
(a + b) + c != a + (b + c)
浮点数的#1“不要”规则是:
不要在整数就足够的情况下使用浮点数。
请务必了解浮点的行为方式。
不要相信简单的规则就足以正确使用它们。
例如,至少有两个答案建议禁止比较浮点是否相等。首先,在某些情况下,需要比较它们是否相等。然后,当需要进行范围检查时,您还需要意识到它有其缺陷,例如它不是传递性的,这是大多数人在相等性测试中会假设的属性。
永远不要尝试进行相等比较
双达,分贝;
...
如果 (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 异常痛苦并导致更多错误。不幸的是,这就是我们在大多数平台上生活的世界。
我避免浮点陷阱的“主要武器”是牢牢掌握它们的工作方式。我认为Chris Hecker很好地解释了基础知识。
搜索、下载和阅读“每个计算机科学家都应该了解的浮点运算知识”