想象一下,inexperienced programmer尝试比较2个浮点数的等价性:
a = 0.01
b = 0.1 ** 2
print(a == b)
是否有任何语言可以对这种愚蠢行为提出异常?或者在python和/或javascript中覆盖默认行为的方法?
如果没有,语言设计决定允许操作的原因是什么?
<小时/> 编辑:看起来我被指责建议不要对浮标进行比较。我没有反对a < b
或float_eq(a, b)
。只是大多数人对==
,!=
,>=
和<=
运算符应该从他们实际使用浮点数做的事情有着截然不同的直觉数字。语言设计中有各种先例可以防止人们常犯的一些错误,例如在python中禁用if(a=b)
或在perl中禁用use strict
。
答案 0 :(得分:3)
为什么要为构造float == float
抛出异常,其中一切都是静态的?除非您计划接受if (false && float == float) …
,否则您可能会静态拒绝此构造。
事实上,为什么语言中只有float == float
?有没有浮点的完美语言。如此缺乏经验并且愚蠢地尝试使用浮点计算的程序员最好使用没有它们的编程语言。我个人推荐Ook。
我应该指出,可以智能地使用浮点数,就像编程语言中的大多数其他结构可以智能地使用一样。 CRlibm库包含几种漂亮的微妙浮点计算模式。当编程语言为程序员提供强有力的假设时,它有助于将源代码转换为几乎所有处理器已有多年的IEEE 754硬件指令。 CRlibm库是为C99编译器编写的,它实现了IEEE 754而没有过多的精度。您可以在Java中实现相同的库,但不能在C#中方便地实现。
总之,浮点相等与其他浮点运算一样有用,并且与大多数浮点运算不同,它在数学上是精确的。您可能根本不使用浮点数,您可以使用任何语言,特别是C#。如果您不确定如果可以使用编程语言,则可以避免使用浮点计算,请在Ook中编程。
答案 1 :(得分:2)
0.01 == 0.1 ** 2
可能有效也可能无效(我还没有检查过),但0.25 == 0.5 ** 2
绝对有效,0.1 ** 2 == 0.1 ** 2
也是如此。重要的是要理解为什么你不能指望浮点数在方程式中说它们应该相等的情况下是相等的,但在某些情况下,指望漂浮是完全合理的,也是非常有用的点平等。不允许操作的语言不如不支持操作的语言强大。
答案 2 :(得分:1)
我不知道主流语言是否适用于使用&#39; ==&#39;将浮点作为错误,或者允许您超载&#39; ==&#39;对于原始类型。
但我也不认为这也是一个好主意,因为&#39; ==&#39;可以在有限的情况下安全地使用浮点数...如果你知道你在做什么。
更好的方法(如果您希望保护程序员免受使用&#39; ==&#39;)的天真错误,那就是在您的语言的首选静态代码检查器中实现这一点;例如类似于Lint(对于C)和PMD或FindBugs(对于Java)。