Почему у нас в Ruby 0,0 и -0,0? [Дубликат]

На этот вопрос уже есть ответ:

В ruby, почему я могу присвоить отрицательный знак значению 0.0 float, полезна ли эта функция в любом случае? Может ли кто-нибудь объяснить мне это?

-0.0
#=> -0.0

-0.0 * -1
#=> 0.0
51
задан Stefan 4 November 2019 в 11:30
поделиться

4 ответа

Это - потому что весь числа с плавающей точкой 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
96
ответ дан 24 November 2019 в 17:03
поделиться

Математические операции имеют результаты вещественного числа, но мы отображаем те реальные результаты на ближайшее число с плавающей запятой, которое называют, "округляясь". Для каждого числа с плавающей запятой, существует диапазон из вещественных чисел, которые будут вокруг к тому плаванию, и иногда полезно думать о плавании, как отождествляемом с тем диапазоном вещественных чисел.

С тех пор существует конечное предоставление чисел с плавающей запятой, должно быть самое маленькое положительное плавание и его противоположное, самое маленькое (величина) отрицательное плавание. Но что происходит с результатами вещественного числа, еще меньшими, чем они ? Ну, они должны "вокруг для обнуления". Но "действительно небольшое число, больше, чем нуль" и "действительно небольшое число, меньше, чем нуль" являются довольно разными вещами с довольно различным, математическим поведение , итак, почему мы должны потерять различие между ними, просто потому что мы округляемся? Мы не имеем к.

Так, плавание 0 только включает вещественное число 0, оно также включает too-small-to-represent , положительный количества. И плавание-0 включает too-small-to-represent , отрицательный количества. Когда Вы используете их в арифметике, они следуют, правила как "отрицательные положительные времена равняется отрицательный; отрицательные отрицательные времена равняются положительный". Даже при том, что мы забыли почти все об этих числах в процессе округления, мы все еще не забыли их знак.

40
ответ дан 24 November 2019 в 17:03
поделиться

Это не функция Ruby, но часть спецификации числа с плавающей точкой, см. этот ответ . Отрицательный нуль является равным положительным нулем:

-0.0 == 0.0
# => true

25
ответ дан 24 November 2019 в 17:03
поделиться

Пример того, когда Вам, возможно, понадобилось бы-0.0, при работе с функцией, такой как касательная, секанс или косеканс, который имеет вертикальные полюса, которые должны идти в правильном направлении. Вы могли бы закончить тем, что делились для получения отрицательной бесконечности, и Вы не захотите изображать это в виде графика как вертикальную строку, стреляющую до положительной бесконечности. Или Вам, возможно, понадобился бы корректный знак функции, асимптотически приближающейся 0 снизу, как то, если бы you’ve получил экспоненциальный распад отрицательного числа, и проверьте, что это остается отрицательным.

2
ответ дан 24 November 2019 в 17:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: