В Юлии: Равенство Float64 и BigFloat - PullRequest
0 голосов
/ 09 сентября 2018

В REPL Julia 1.0.0 я получаю следующие результаты:

# 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

Кажется, что Джулия здесь что-то скрывает для сравнения на равенство с Float64 и BigFloat, что делает строки 2 и 4 истиннымив то время как строки 1 и 3 являются ложными.Любые предложения?

Документ Джулии относительно "==", по-видимому, не охватывает такого рода вещи: 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

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Причина, по которой они не одинаковы, в том, что они не одинаковы

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
0 голосов
/ 10 сентября 2018

Некоторое число с плавающей точкой может быть представлено точно (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)

...