为了确保良好的数值稳定性和结果的高精度,浮点运算(IEEE754,如果存在混淆)有什么好处和不做什么?
我知道有些人不喜欢减去相似数量的数量,但我很好奇其他有什么好的规则。
答案 0 :(得分:12)
首先,输入浮点数 NOT 的概念必须遵循与实数相同的规则......一旦你接受了这个,你就会理解大部分的陷阱。
以下是我一直遵循的一些规则/提示:
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)
搜索,下载和阅读 “每个计算机科学家都应该了解浮点运算”