使用没有epsilon的浮点数总是代码味道?

Syn*_*r0r 1 floating-point floating-point-exceptions epsilon

这个问题很简单.它与但绝对不是一个骗局有关:

大多数未修补的Tomcat Web服务器都很脆弱,谁有错?

看事物的数量惊人,可以去错浮点数(包括但不正确使用时不限于在不同的体系结构不同的结果,错误的结果,两年的拒绝服务崩溃的影响两种不同的语言等),我我想知道一个非常简单的问题:

在没有epsilon的情况下使用的浮点数总是代码气味或规格气味吗?

(也就是说:浮点数是否真的只能用于科学计算,其余部分应该使用固定数量的精度来完成?)

Ste*_*non 5

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

实际上,在我的工作(低级高性能库)中,带有容差的浮点比较是代码气味:它们表明程序员要么不理解浮点数,要么不完全理解数字的数字.他们正在实施的算法,它引发了我应该非常非常密切地阅读其余代码的大警告.

这并不是说它们永远不应该被使用.有很多情况(甚至是大多数情况),这是正确的事情.这只是说所有硬性规则都是愚蠢的,包括这一规则.


对于你澄清的问题:"浮点数是否真的只能用于科学计算,其余部分应该使用固定数量的精度来完成?"

当然不是.这将是一个巨大的工程负担,并且启动效率极低.对于没有经验的程序员来说,使用整数算法(溢出,除法,截断,越界数组访问等等)以自己的方式使用浮点进行自我攻击也很容易.浮点对绝大多数程序员来说是一个巨大的便利; 如果不是它就不会被使用.

与所有事情一样,花时间了解您的工具,并使用正确的工具来完成工作.