分数型的比较

wen*_*ong 3 floating-point haskell equality

ghci> 4 == 3.9999999999999999
True

ghci> 10.2^2 == 104.04
False
Run Code Online (Sandbox Code Playgroud)

为什么第二个表达式返回False?

Don*_*art 9

浮点值没有合理的概念.可以说,在Haskell中,表达式甚至类型检查是错误的.该问题对于使用浮点表示的所有语言都是通用的.

关于浮点的一些参考:

考虑使用Rational哈斯克尔类型,如果你在这里需要正确的数学,但请注意,它支持更小的范围内操作,以及较少的硬件支持.

Prelude> 4 == (3.9999999999999 :: Rational)
False
Prelude> 10.2^2 == (104.04 :: Rational)
True
Run Code Online (Sandbox Code Playgroud)

  • 浮点有一个完全合理的平等概念.这是您对比较的值的不确定性的期望. (2认同)
  • @Stephen - 如果"非常明智"你的意思是"`x == x`可以是假的,而`x == y`可以取决于`x`和/或`y`是否通过内存往返,因为他们被计算的时间"...... (2认同)
  • @Stephen - 我同意在这个意义上它是完全明智的,但我也倾向于同意@Don和其他人认为它不是一个"平等概念",至少不是数学概念.第一种情况(`x == x`为假)不依赖于过多的精度,它在IEEE规范中.即使对于相同的NaN,NaN == NaN也是假的.根据定义,这使它不是一个平等关系.但是,"平等"一直在编程中比在数学中更实际.毕竟,实际上,实数的平等实际上并不是可判定的(建设性的,无论如何). (2认同)

Luk*_*keH 8

  • 只要在问题中检测到小数点,Stack Overflow就会自动将您链接到此:) (7认同)
  • @Stephen:你愿意详细说明吗?这篇链接的文章非常多*是这些类型问题的规范答案.我添加的任何细节都只是不必要地重复文章中的内容. (2认同)