这个问题非常简单。它与以下内容有关但绝对不是:
Most unpatched Tomcat webservers are vulnerable, who's at fault?
看到浮点数可能出错的大量事情(包括但不限于不同架构上的不同结果,错误使用错误结果,两种拒绝服务崩溃影响两种不同语言等)我想知道一个非常简单的问题:
在没有epsilon的情况下使用的浮点数是不是代码气味或规格气味?
(也就是说:浮点数是否真的只能用于科学计算,所有其余的都应该使用固定数量的精度来完成?)
答案 0 :(得分:5)
不,他们绝对不总是代码味道。
事实上,在我的工作(低级高性能库)中,带有容差的浮点比较是代码气味:它们表明程序员要么不理解浮动指出,或者不完全理解他们正在实现的算法的数字,这引发了我应该非常非常密切地阅读其余代码的大警告。
这并不是说永远不应该使用它们。有很多情况(甚至是大多数情况),这是正确的事情。只是说所有硬性规则都是愚蠢,包括这个规则。
对于你澄清的问题:“浮点数是否真的只能用于科学计算,其余部分应该使用固定数量的精度来完成?”
当然不是。这将是一个巨大的工程负担,并且启动效率极低。对于没有经验的程序员来说,使用整数运算(溢出,除法,截断,超出范围的数组访问等等)就像浮点一样轻松地射击自己。浮点对绝大多数程序员来说是一个巨大的便利;如果不是它就不会被使用。
与所有事情一样,花点时间了解您的工具,并使用正确的工具来完成工作。
答案 1 :(得分:1)
有时真的不需要精确度。游戏引擎使用浮点进行渲染。同样,你不会用浮点数进行货币计算,但用浮点数编写图形系统并不是问题。
当你混淆两组不同的数据时会出现问题(一组非精确,一组精确(或更精确))例如,游戏开发人员常常使用相同的坐标系来处理他们的世界坐标,就像他们那样做渲染,然后当世界变得巨大时,他们的单精度浮动开始显示出重大的舍入错误。完整全局位置坐标的公差与2D局部区域到3D屏幕空间坐标系统中的公差不同。