Типы чисел с плавающей точкой в Julia:
Числа с плавающей точкой вводятся и выводятся стандартным образом:
julia> 1.0
1.0
julia> 1.
1.0
julia> 0.5
0.5
julia> .5
0.5
julia> -1.23
–1.23
При необходимости можно использовать E-нотацию:
julia> 1e10
1.0e10
julia> 2.5e-4
0.00025
Все результаты из примеров выше имеют тип Float64 (тип по умолчанию). Если вы хотите ввести значение с типом Float32, то необходимо использовать f вместо e следующим образом:
julia> x = 0.5f0
0.5f0
julia> typeof(x)
Float32
julia> 2.5f-4
0.00025f0
Значение с типом Float16:
julia> Float16(4.)
Float16(4.0)
julia> 2*Float16(4.)
Float16(8.0)
Числа с плавающей точкой имеют два нуля – положительный нуль и отрицательный нуль. Они равны друг другу, но имеют разные двоичные представления, что можно увидеть с помощью функции bitstring(), которая дает буквальное битовое представление примитивного типа:
julia> 0.0 == -0.0
true
julia> bitstring(0.0)
"0000000000000000000000000000000000000000000000000000000000000000"
julia> bitstring(-0.0)
"1000000000000000000000000000000000000000000000000000000000000000"
Когда точности или размерности Float64 недостаточно, можно использовать специальный тип BigFloat:
julia> 2.0^100/4
3.1691265005705735e29
julia> BigFloat(2.0)^100/4
3.16912650057057350374175801344e+29
BigFloat знаковый тип арифметики произвольной точности, не назначаемый автоматически при вводе, а требующий явного объявления для использования.
Функции минимального и максимального значений для типов также применимы:
julia> (typemin(Float16),typemax(Float16))
(-Inf16, Inf16)
julia> (typemin(Float32),typemax(Float32))
(-Inf32, Inf32)
julia> (typemin(Float64),typemax(Float64))
(-Inf, Inf)
Результатом будут специальные значения – отрицательная и положительная бесконечности. Значения чисел превышающих числовой диапазон типа также будут заменены на специальные значения:
julia> 4.2^1000
Inf
julia> -4.2^1000
–Inf
Существует три определенных стандартных значения с плавающей точкой, которые не соответствуют ни одной точке на линии вещественных чисел:
По стандарту IEEE 754, эти значения с плавающей точкой являются результатами определенных арифметических операций:
julia> 1/0
Inf
julia> -5/0
–Inf
julia> 0.000001/0
Inf
julia> 0/0
NaN
julia> 1/Inf
0.0
julia> 1/-Inf
–0.0
julia> -1/Inf
–0.0
julia> -1/-Inf
0.0
julia> 500 + Inf
Inf
julia> 500 – Inf
–Inf
julia> Inf + Inf
Inf
julia> -Inf -Inf
–Inf
julia> Inf – Inf
NaN
julia> Inf * Inf
Inf
julia> Inf*-Inf
–Inf
julia> -Inf * -Inf
Inf
julia> Inf / Inf
NaN
julia> Inf /-Inf
NaN
julia> -Inf /Inf
NaN
julia> -Inf /-Inf
NaN
julia> 0 * Inf
NaN
julia> 0 *-Inf
NaN
NaN не равно, не меньше и не больше чего-либо, включая самого себя:
julia> NaN == NaN
false
julia> NaN != NaN
true
julia> NaN < NaN
false
julia> NaN > NaN
false
Это может вызвать проблемы, например при работе с массивами:
julia> [1 NaN] == [1 NaN]
false
Функции Julia для работы со специальными значениями:
Функция isequal() считает NaNs равными друг другу:
julia> isequal(NaN, NaN)
true
julia> isequal([1 NaN], [1 NaN])
true
julia> isequal(NaN, NaN32)
true
Функцию isequal() можно также использовать для различения знаковых нулей:
julia> -0.0 == 0.0
true
julia> isequal(-0.0, 0.0)
false
Большинство реальных чисел не могут быть точно представлены числами с плавающей точкой, поэтому для многих целей важно знать расстояние между двумя соседними представляемыми числами с плавающей точкой, которое часто называют машинным эпсилоном.
Функция eps() в Julia дает расстояние между 1.0 и следующим большим значением с плавающей точкой, при использовании в качестве аргумента типа числа с плавающей точкой:
julia> eps(Float16)
Float16(0.000977)
julia> eps(Float32)
1.1920929f-7
julia> eps(Float64)
2.220446049250313e-16
julia> eps(BigFloat)
1.727233711018888925077270372560079914223200072887256277004740694033718360632485e-77
Функция eps также может принимать в качестве аргумента значение с плавающей точкой, и выдавать абсолютную разницу между этим значением и следующим представимым значением с плавающей точкой. Другими словами, eps(x) выдает значение того же типа, что и x, такое, что x + eps(x) является следующим представимым значением с плавающей точкой, большим, чем x. Тип значения при этом также учитывается:
julia> eps(1.0)
2.220446049250313e-16
julia> eps(1000.)
1.1368683772161603e-13
julia> eps(1e-27)
1.793662034335766e-43
julia> eps(0.0)
5.0e-324
Расстояние между двумя соседними представляемыми числами с плавающей точкой не является постоянным, оно меньше для меньших значений и больше для больших значений. Другими словами, представляемые числа с плавающей запятой наиболее плотно расположены на линии вещественных чисел вблизи нуля и становятся более редкими экспоненциально по мере удаления от нуля. По определению, eps(1.0) – это то же самое, что eps(Float64), поскольку 1.0 – это 64-битное значение с плавающей точкой.
Если число не имеет точного представления с плавающей точкой, оно будет округлено до соответствующего представляемого значения. По умолчанию Julia использует режим округления, называемый RoundNearest. Он округляет до ближайшего целого числа, а ничьи округляются до ближайшего четного целого числа.