在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行为false。有什么建议吗?
有关“ ==”的Julia文档似乎并未涵盖以下内容: https://docs.julialang.org/en/v1/base/math/#Base.:==
编辑: 根据下面@EPo的有用评论,很容易使上面的所有比较都成为现实。例如,第1行和第3行在下面为true,但在上面为false:
# 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
答案 0 :(得分:7)
某些浮点数可以准确表示(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)
答案 1 :(得分:1)
它们不一样的原因是因为它们不一样
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