Вы можете использовать публичный наблюдаемый список для хранения общедоступных данных или просто создать общедоступный метод настройки для хранения данных и получения из соответствующего контроллера
Это - потому что весь числа с плавающей точкой IEEE 754 имеют знаковый бит , чтобы указать, положительно ли число или отрицательно.
Вот двоичные представления 2.5
и -2.5
:
[2.5].pack('f').unpack1('b*')
#=> "00000000000000000000010000000010"
[-2.5].pack('f').unpack1('b*')
#=> "00000000000000000000010000000011"
последний бит является знаковым битом, обратите внимание, что все другие биты идентичны.
, С другой стороны, существует нуль с набором знакового бита к 0
:
['00000000000000000000000000000000'].pack('b*').unpack1('f')
#=> 0.0
и нуль с набором знакового бита к 1
:
['00000000000000000000000000000001'].pack('b*').unpack1('f')
#=> -0.0
, Хотя 0.0
и -0.0
численно равны, они не идентичны на уровне объектов:
(0.0).eql?(-0.0) #=> true
(0.0).equal?(-0.0) #=> false
и существуют приблизительно [1 115] специальные свойства при работе с отрицательным нулем, например:
1 / 0.0 #=> Infinity
1 / -0.0 #=> -Infinity
Присвоение -
явно не является единственным способом добраться -0.0
. Можно также получить его как результат основной арифметической операции:
-1.0 * 0 #=> -0.0
Математические операции имеют результаты вещественного числа, но мы отображаем те реальные результаты на ближайшее число с плавающей запятой, которое называют, "округляясь". Для каждого числа с плавающей запятой, существует диапазон из вещественных чисел, которые будут вокруг к тому плаванию, и иногда полезно думать о плавании, как отождествляемом с тем диапазоном вещественных чисел.
С тех пор существует конечное предоставление чисел с плавающей запятой, должно быть самое маленькое положительное плавание и его противоположное, самое маленькое (величина) отрицательное плавание. Но что происходит с результатами вещественного числа, еще меньшими, чем они ? Ну, они должны "вокруг для обнуления". Но "действительно небольшое число, больше, чем нуль" и "действительно небольшое число, меньше, чем нуль" являются довольно разными вещами с довольно различным, математическим поведение , итак, почему мы должны потерять различие между ними, просто потому что мы округляемся? Мы не имеем к.
Так, плавание 0 только включает вещественное число 0, оно также включает too-small-to-represent , положительный количества. И плавание-0 включает too-small-to-represent , отрицательный количества. Когда Вы используете их в арифметике, они следуют, правила как "отрицательные положительные времена равняется отрицательный; отрицательные отрицательные времена равняются положительный". Даже при том, что мы забыли почти все об этих числах в процессе округления, мы все еще не забыли их знак.
Это не функция Ruby, но часть спецификации числа с плавающей точкой, см. этот ответ . Отрицательный нуль является равным положительным нулем:
-0.0 == 0.0
# => true
Пример того, когда Вам, возможно, понадобилось бы-0.0, при работе с функцией, такой как касательная, секанс или косеканс, который имеет вертикальные полюса, которые должны идти в правильном направлении. Вы могли бы закончить тем, что делились для получения отрицательной бесконечности, и Вы не захотите изображать это в виде графика как вертикальную строку, стреляющую до положительной бесконечности. Или Вам, возможно, понадобился бы корректный знак функции, асимптотически приближающейся 0 снизу, как то, если бы you’ve получил экспоненциальный распад отрицательного числа, и проверьте, что это остается отрицательным.