Floating point 使用不带ε的浮点数是否总是一种代码气味?

Floating point 使用不带ε的浮点数是否总是一种代码气味?,floating-point,epsilon,floating-point-exceptions,Floating Point,Epsilon,Floating Point Exceptions,这个问题很简单。这与以下内容有关,但绝对不是重复: 看到了大量浮点数可能出错的情况,包括但不限于不同体系结构上的不同结果、错误使用时的错误结果、影响两种不同语言的两次拒绝服务崩溃等。我想知道一个非常简单的问题: 使用不带ε的浮点数是否总是代码气味或规范气味 也就是说:浮点数真的应该只用于科学计算,而其余的都应该使用固定数量的精度位吗?有时候真的不需要精度。游戏引擎始终使用浮点进行渲染。类似地,您不会使用浮动进行货币计算,但使用浮动编写图形系统并不是问题 当您将两组不同的数据(一组不精确、一组精确

这个问题很简单。这与以下内容有关,但绝对不是重复:

看到了大量浮点数可能出错的情况,包括但不限于不同体系结构上的不同结果、错误使用时的错误结果、影响两种不同语言的两次拒绝服务崩溃等。我想知道一个非常简单的问题:

使用不带ε的浮点数是否总是代码气味或规范气味


也就是说:浮点数真的应该只用于科学计算,而其余的都应该使用固定数量的精度位吗?

有时候真的不需要精度。游戏引擎始终使用浮点进行渲染。类似地,您不会使用浮动进行货币计算,但使用浮动编写图形系统并不是问题


当您将两组不同的数据(一组不精确、一组精确或更精确)合并在一起时,问题就出现了。例如,游戏开发人员通常使用与渲染相同的坐标系作为世界坐标系,然后当世界变得巨大时,他们的单精度浮点开始显示主要的舍入错误。完整全局位置坐标的公差与2D-local-area-to-3D-screen-space坐标系中的公差不同。

有时确实不需要精度。游戏引擎始终使用浮点进行渲染。类似地,您不会使用浮动进行货币计算,但使用浮动编写图形系统并不是问题

当您将两组不同的数据(一组不精确、一组精确或更精确)合并在一起时,问题就出现了。例如,游戏开发人员通常使用与渲染相同的坐标系作为世界坐标系,然后当世界变得巨大时,他们的单精度浮点开始显示主要的舍入错误。完整全局位置坐标的公差与2D-local-area-to-3D-screen-space坐标系中的公差不同。

不,它们绝对不总是代码味道

事实上,在我从事的低级别高性能库的工作中,带容差的浮点比较是一种代码味道:它们表明程序员要么不理解浮点,要么不完全理解他们正在实现的算法的数值,这给我敲响了警钟,我应该非常非常仔细地阅读代码的其余部分

这并不是说它们永远不应该被使用。在很多情况下,甚至在大多数情况下,这样做是正确的。这只是说所有硬性规定都是愚蠢的,包括这一条

对于你澄清的问题:浮点数真的应该只用于科学计算,而其余的都应该使用固定的精度位数吗

当然不是。这将是一个巨大的工程负担,而且开机效率极低。对于一个没有经验的程序员来说,用整数算术溢出、除法是截断、数组越界访问等等攻击自己就像用浮点一样容易。浮点运算对绝大多数程序员来说是一种极大的方便;如果不是,它就不会被使用

与所有事情一样,花点时间了解你的工具,并为工作使用正确的工具。

不,它们绝对不总是一种代码味道

事实上,在我从事的低级别高性能库的工作中,带容差的浮点比较是一种代码味道:它们表明程序员要么不理解浮点,要么不完全理解他们正在实现的算法的数值,这给我敲响了警钟,我应该非常非常仔细地阅读代码的其余部分

这并不是说它们永远不应该被使用。在很多情况下,甚至在大多数情况下,这样做是正确的。这只是说所有硬性规定都是愚蠢的,包括这一条

对于你澄清的问题:浮点数真的应该只用于科学计算,而其余的都应该使用固定的精度位数吗

当然不是。这将是一个巨大的工程负担,而且开机效率极低。对于一个没有经验的程序员来说,用整数算术溢出、除法是截断、数组越界访问等等攻击自己就像用浮点一样容易。浮点运算对绝大多数程序员来说是一种极大的方便;如果不是,它就不会被使用

与所有事情一样,花时间了解你的工具,并使用适合工作的工具。

注意

我这里有一个250 KLOC的代码库,做了很多令人印象深刻的事情,包括货币计算、绘图等。我的代码库中没有浮点数的实例。你想要一个意见或一些明确的资源吗?我的意见是肯定的。。。但我觉得你想要more@ScottM:我想要一个吉米给我的答案。我真的很想知道,我是否可以把浮点在非科学计算中的每一个外观都看作是完全迟钝的。对我来说,正如你所想,这也是一种代码的味道。然而,吉米给出了一个可以接受的好例子。但游戏中的物理是一种科学计算-/除此之外,我想重复使用有史以来最酷的标签,以便我为另一个问题创建标签;浮点中JVM缺陷的存在很难使所有浮点的使用都受到怀疑。如果明天有人发现一个带有“int”值的模糊JVM错误,你会建议停止使用int吗?请注意,我这里有一个250 KLOC的代码库,做了很多非常令人印象深刻的事情,包括货币计算、绘图、,等等,在我的代码库中,浮点数的实例是零。你想要一个意见或一些明确的资源吗?我的意见是肯定的。。。但我觉得你想要more@ScottM:我想要一个吉米给我的答案。我真的很想知道,我是否可以把浮点在非科学计算中的每一个外观都看作是完全迟钝的。对我来说,正如你所想,这也是一种代码的味道。然而,吉米给出了一个可以接受的好例子。但游戏中的物理是一种科学计算-/除此之外,我想重复使用有史以来最酷的标签,以便我为另一个问题创建标签;浮点中JVM缺陷的存在很难使所有浮点的使用都受到怀疑。如果明天有人发现一个带有“int”值的模糊JVM错误,你会建议停止使用int吗?你怎么能存储近似值的数字而不关心错误是什么?我知道你显然知道你的主题,但好奇的人想知道。你对这些浮点数做什么样的操作?为什么你不必处理错误传播?@SyntaxT3rr0r:这是问题的关键:为什么你可以存储近似值的数字。。。。可以将浮点数视为近似值,但不需要这样做。浮点数完全等于某个数字,而不是一个模糊的区间,就像整数3实际上是3一样,也不是3到4之间数字的近似值。当然,需要考虑舍入误差的传播,但在我所研究的库中,我们通常知道所产生舍入误差的严格界限,软件经过精心设计,以控制或消除舍入误差的累积。当舍入误差无法控制或未知时,大量使用ε公差是为了解释舍入误差——这不是我通常所处的情况。我能断定你在从事科学应用吗?很明显,您对这个问题很了解,对我来说,这与使用浮点库解析HTTP头的人非常不同!也许可以将这句话改为:在没有ε的非科学应用中使用浮点数是否总是一种代码气味?@SyntaxT3rr0r:不,我不从事科学应用,尽管我受过训练,是一名科学家。我是一个系统库编写者,我的代码被各种各样的开发人员调用。你怎么能存储近似的数字而不关心错误是什么?我知道你显然知道你的主题,但好奇的人想知道。你对这些浮点数做什么样的操作?为什么你不必处理错误传播?@SyntaxT3rr0r:这是问题的关键:为什么你可以存储近似值的数字。。。。可以将浮点数视为近似值,但不需要这样做。浮点数完全等于某个数字,而不是一个模糊的区间,就像整数3实际上是3一样,也不是3到4之间数字的近似值。当然,需要考虑舍入误差的传播,但在我所研究的库中,我们通常知道所产生舍入误差的严格界限,软件经过精心设计,以控制或消除舍入误差的累积。当舍入误差无法控制或未知时,大量使用ε公差是为了解释舍入误差——这不是我通常所处的情况。我能断定你在从事科学应用吗?很明显,您对这个问题很了解,对我来说,这与使用浮点库解析HTTP头的人非常不同!也许可以将其改写为:浮点数在非科学应用中使用时是否没有e
psilon总是有代码气味吗?@SyntaxT3rr0r:不,我不从事科学应用,尽管我受过训练,是一名科学家。我是一个系统库编写者,我的代码被各种各样的开发人员调用。