这个问题很简单。它与以下内容有关,但绝对不是:
大多数未打补丁的 Tomcat 网络服务器都容易受到攻击,谁的错?
看到浮点数可能出错的惊人数量(包括但不限于不同架构上的不同结果、错误使用时的错误结果、影响两种不同语言的两次拒绝服务崩溃等)我'我想知道一个非常简单的问题:
在没有 epsilon 的情况下使用浮点数是否总是代码气味或规格气味?
(也就是说:浮点数真的应该只用于科学计算,其余的都应该使用固定数量的精度来完成吗?)
这个问题很简单。它与以下内容有关,但绝对不是:
大多数未打补丁的 Tomcat 网络服务器都容易受到攻击,谁的错?
看到浮点数可能出错的惊人数量(包括但不限于不同架构上的不同结果、错误使用时的错误结果、影响两种不同语言的两次拒绝服务崩溃等)我'我想知道一个非常简单的问题:
在没有 epsilon 的情况下使用浮点数是否总是代码气味或规格气味?
(也就是说:浮点数真的应该只用于科学计算,其余的都应该使用固定数量的精度来完成吗?)
不,它们绝对不总是代码味道。
事实上,在我的工作(低级高性能库)中,带有容差的浮点比较是一种代码味道:它们表明程序员要么不理解浮点,要么不完全理解他们正在实现的算法,这引发了我应该非常非常仔细地阅读其余代码的巨大警钟。
这并不是说它们永远不应该被使用。有很多情况(甚至可能是大多数情况)这是正确的做法。只能说所有的硬性规则都是愚蠢的,包括这个。
对于您澄清的问题:“浮点数真的应该只用于科学计算,其余的都应该使用固定数量的精度来完成吗?”
当然不是。这将是一个巨大的工程负担,而且启动效率极低。对于一个没有经验的程序员来说,用整数算术(溢出、除法截断、越界数组访问等)与浮点数一样容易。浮点数对绝大多数程序员来说是一个极大的便利;如果不是,它将不会被使用。
与所有事情一样,花时间了解您的工具,并为工作使用正确的工具。
有时真的不需要精确。游戏引擎一直使用浮点进行渲染。同样,您不会使用浮点数进行货币计算,但使用浮点数编写图形系统不是问题。
当您将两组不同的数据(一组不精确,一组精确(或更精确))混为一谈时,问题就出现了。例如,游戏开发人员通常会使用与渲染相同的坐标系作为世界坐标,然后当世界变得巨大时,它们的单精度浮点数开始显示出主要的舍入误差。完整全局位置坐标的容差与 2D 局部区域到 3D 屏幕空间坐标系中的容差不同。