【问题标题】:In Julia: Equality of Float64 and BigFloat在 Julia 中:Float64 和 BigFloat 的相等性
【发布时间】:2018-09-09 20:15:09
【问题描述】:

在 Julia 1.0.0 REPL 中,我得到以下结果:

# Line 1: This make sense.  I did not expect a Float64 to equal a BigFloat.
julia> 26.1 == big"26.1"
false

# Line 2: This surprised me when Line 1 is considered.  Again, like Line 1, I 
# did not expect a Float64 to equal an equivalent BigFloat.
julia> 26.0 == big"26.0"
true

# Line 3: This I expected based on Line 1 behavior.
julia> 26.1 - 0.1 == big"26.1" - 0.1
false

# Line 4: This surprised me based on Line 1 behavior, but it might be 
# explained based on Line 2 behavior.  It seems to imply that if a Float64 
# can be converted to an Integer it will compare equal to an equivalent BigFloat.
julia> 26.1 - 0.1 == big"26.1" - big"0.1"
true

似乎 Julia 在这里做了一些事情来与 Float64 和 BigFloat 进行相等比较,这使得第 2 行和第 4 行为真,而第 1 和第 3 行为假。有什么建议吗?

关于“==”的 Julia 文档似乎没有涵盖这种事情: https://docs.julialang.org/en/v1/base/math/#Base.:==

编辑: 根据下面@EPo 的有用评论,很容易使上面的所有比较都成真。例如,第 1 行和第 3 行在下面为真,尽管它们在上面为假:

# Line 1 is now true.
julia> 26.1 ≈ big"26.1"
true

# Line 3 is now true.
julia> 26.1 - 0.1 ≈ big"26.1" - 0.1
true

【问题讨论】:

  • 我认为 Julia 并没有在幕后做任何事情,但你遇到了 exploringbinary.com/…
  • 尝试使用 ≈ (近似相等,\approx)
  • @crstnbr,我现在从下面接受的答案中看到你是对的。我没想到 26.0 会在 Float64 中如此准确地表示。
  • @EPo,感谢您的建议。

标签: julia precision arbitrary-precision


【解决方案1】:

一些浮点数可以精确表示(26.0)但不是全部,例如:

julia> using Printf
julia> @printf("%.80f",26.0)
26.00000000000000000000000000000000000000000000000000000000000000000000000000000000
julia> @printf("%.80f",0.1)
0.10000000000000000555111512312578270211815834045410156250000000000000000000000000

例如小数点 0.5、0.25、0.125 也可以用基于二进制的浮点表示来精确表示。例如,您有:

julia> 26.125 - 0.125 == big"26.125" - 0.125
true

但是0.1是二进制中的周期数,所以是四舍五入的。

julia> bitstring(0.1)
"0011111110111001100110011001100110011001100110011001100110011010"

最后 52 位表示二进制小数。 (https://en.wikipedia.org/wiki/Double-precision_floating-point_format)

【讨论】:

  • 很好的答案!谢谢。
  • 这可能也很有趣:youtube.com/… 该视频展示了在 Julia 1.0 中如何比较值
【解决方案2】:

他们不一样的原因是因为他们不一样

julia> using Printf
julia> string(BigFloat("26.1")-BigFloat("26"))
"1.000000000000000000000000000000000000000000000000000000000000000000000000000553e-01"
julia> @printf("%.17e",Float64(26.1)-Float64(26))
1.00000000000001421e-01
julia> Float64(26.1)-Float64(26) > BigFloat("26.1")-BigFloat("26")
true

【讨论】:

  • 感谢您的评论。但是,它是否解释了上面的第 2 行 26.0 == big"26.0" 的计算结果为 true
  • 数字 26.0 在 Float64 和 BigFloat 中都是整数 26。任何整数都可以在 Float64 和 BigFloat 浮点系统中精确表示。并且因为整数可以精确表示,所以它们都是相同的,因此计算结果为 true。
  • 感谢您的评论。这是让我感到惊讶的核心。
猜你喜欢
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多