Floating point 如何在'float==float'操作上引发异常?

Floating point 如何在'float==float'操作上引发异常?,floating-point,invalidoperationexception,Floating Point,Invalidoperationexception,假设an尝试比较2个浮点数以获得等价性: a = 0.01 b = 0.1 ** 2 print(a == b) 有什么语言会对这种愚蠢行为破例吗?还是一种覆盖python和/或javascript中默认行为的方法 如果不是,语言设计决定允许操作的原因是什么? 编辑:看来我被指控建议不可能对浮动进行比较。我不反对a

假设an尝试比较2个浮点数以获得等价性:

a = 0.01
b = 0.1 ** 2
print(a == b)
有什么语言会对这种愚蠢行为破例吗?还是一种覆盖python和/或javascript中默认行为的方法

如果不是,语言设计决定允许操作的原因是什么?
编辑:看来我被指控建议不可能对浮动进行比较。我不反对a为什么要为一个结构抛出一个异常,float==float,其中所有内容都是静态的?除非您计划接受if false&&float==float…,否则您最好静态地拒绝此构造

事实上,为什么语言中有float==float?没有浮点的语言是非常好的。如果程序员缺乏经验,愚蠢地尝试使用浮点计算,那么最好使用没有浮点计算的编程语言。我个人推荐

我应该指出,可以智能地使用浮点,就像在编程语言中发现的大多数其他构造可以智能地使用一样。该库包含几个漂亮的精细浮点计算模式。当编程语言对源代码转换为IEEE 754硬件指令的方式给予程序员强有力的假设时,它会有所帮助,几乎所有处理器都已经有了这些年了。CRlibm库是为C99编译器编写的,该编译器实现IEEE 754而无需额外的精度。例如,您可以用Java实现同一个库,但用C不方便


总之,浮点等式与其他浮点运算一样有用,而且它在数学上是精确的,与大多数浮点运算不同。你最好不要使用浮点运算,这在任何语言中都可以做到,特别是在C语言中。如果你不确定是否可以避免使用浮点运算(如果在编程语言中可用),请在Ook中编程。

我不知道有哪种主流语言会将浮点运算中使用“==”视为错误,或者允许您为基元类型重载“==”

但我也不认为这是个好主意,因为在有限的情况下,'=='可以在浮点上安全地使用。。。如果你知道你在做什么


如果您想保护程序员免受使用“==”的幼稚错误的影响,更好的方法是在您的语言首选的静态代码检查器中实现这一规则;e、 g.对于C和PMD,模拟Lint,对于Java,模拟FindBugs。

这是一个有意义的操作。你不应该仅仅因为不允许0.1+0.2而不允许它,因为它可能不会达到你所期望的效果。你可以安全地对某些值执行它,零是一个有趣的值。如果我想,为什么我不能比较0.1**2和0.01呢?可能会误用整数之间的加法,这是否也会引发异常?@PascalCuoq,因为有些人不认为0.1**2==0.01是错误的。能够比较两个浮点数是否相等非常有用。浮点数学与实数数学非常非常不同,程序员越早意识到这一点,他们所面临的惊喜就越少。试图隐藏差异,因为它们可能会被混淆,这是一种愚蠢的想法,这就是为什么没有语言会这么做。float_eqa,b在某些情况下已经足够了,语言没有必要变得不那么强大。。python中有一个优先级,如果a=b,则不允许变量赋值,这样人们就不太可能一意孤行。除非我保证检查每个函数的顶部是否写有参数类型,否则你最好让程序拒绝编译。强迫程序员跳转来执行定义良好的操作有时可能是个好主意,但不是一般的,而且这绝对不是Pythonic。我不知道没有经验的程序员不应该使用浮点运算。回答0.1+0.2!=0.3????? 第无数次肯定是不好玩的,但是当你刚开始的时候,有一个sorta像实数一样工作的抽象是非常有用的。@tmyklebu但这不是问题的主题!这就是说,许多语言都有有理数,许多语言都有十进制数,甚至十进制数显然也足以掩盖它的缺陷,这种人
询问或回答以下问题的人,如认为准确。当有人键入var amount=2.3时,将小数点后10位的定点数字作为默认格式;可以避免很多不眠之夜,我会看一看,谢谢@迪塔普里尔提到Ook只是个玩笑,对不起。但任何现代高级语言都应该使用十进制或有理数来补充浮点,所以只需使用您最喜欢的语言中可用的内容即可。