Чому числа з плаваючою комою мають нульові знаки?


Відповіді:


87

-0(як правило) розглядається як 0*******. Це може привести , коли негативне число з плаваючою точкою настільки близько до нуля , що його можна вважати 0(щоб бути ясно, я маю в вигляді арифметичне спустошення , і результати наступних обчислень інтерпретуються як саме ±0 , не тільки дуже маленькими цифри). напр

System.out.println(-1 / Float.POSITIVE_INFINITY);
-0,0

Якщо ми розглянемо той самий випадок із позитивним числом, ми отримаємо наш добрий старий 0:

System.out.println(1 / Float.POSITIVE_INFINITY);
0,0

******* Ось випадок, коли використання -0.0призводить до чогось іншого, ніж при використанні 0.0:

System.out.println(1 / 0.0);
System.out.println(1 / -0.0);
Нескінченність
-Нескінченність

Це має сенс, якщо розглядати функцію 1 / x. Коли xнаближається 0з- +сторони, ми повинні отримувати позитивну нескінченність, але коли вона наближається з- -сторони, ми повинні отримувати негативну нескінченність. Графік функції повинен чітко це зрозуміти:

( джерело )

У математичному плані:

введіть тут опис зображення

введіть тут опис зображення

Це ілюструє одну істотну різницю між 0і -0в обчислювальному сенсі.


Ось декілька відповідних ресурсів, деякі з яких вже були описані. Я включив їх заради повноти:


29

З Вікіпедії

Підписаний нуль дорівнює нулю з відповідним знаком. У звичайній арифметиці −0 = +0 = 0. Під час обчислень існує концепція існування двох нулів у деяких представленнях чисел, що зазвичай позначаються знаком −0 і '+0', що представляє негативний нуль та +0 позитивний нуль відповідно ( джерело ).

Це відбувається в поданні знаків і величини та доповнення одиниць підписаних чисел для цілих чисел, а також у більшості подань чисел із плаваючою комою. Число 0 зазвичай кодується як +0, але може бути представлене або +0, або −0.

Відповідно до IEEE 754 standard, від’ємний нуль та позитивний нуль повинні порівнюватися як рівні із звичайними (числовими) операторами порівняння, як оператори == для C та Java. ( джерело ).

Коли у вас є операція з плаваючою точкою, яка дає результат, який є від'ємним числом із плаваючою точкою, близьким до нуля , але який не може бути представлений (комп'ютером), він видає "-0,0". Наприклад - 5.0 / Float.POSITIVE_INFINITY -> -0.0.

Ця різниця між -0.0і +0.0дає кінцевому користувачеві більше інформації, ніж просто відображення кінцевого результату 0. Природно, що така концепція дійсно корисна лише в системах з обмеженим числовим обмеженням подання, таких як комп'ютери. У математиці можна представити будь-яке число, незалежно від того, наскільки воно близьке до нуля.

−0і +0є результатом математичних операцій, що виконуються комп’ютерами, що спричиняють недоливи , подібні до тих −00чи, +00що є результатом операцій, що спричиняють переповнення . Для операцій, що викликають математичне невизначення , результатом є NaN ( наприклад, 0/0).

Яка різниця між -0,0 та 0,0?

Насправді обидва представляють 0. Крім того, (-0,0 == 0,0) повертає true . Тим не менше:

  1. 1/-0.0виробляє -Infinity поки 1/0.0виробляє нескінченність .

  2. 3 * (+0)= +0 та +0/-3= -0 . Правила знаків застосовуються, коли виконують множення або ділення на підписаний нуль.

Обов’язкове читання « Що кожен знавець комп’ютерних наук повинен знати про арифметику з плаваючою точкою ».


25

Дивіться розділ "Підписаний нуль" у " Що слід знати кожному комп'ютеристу про арифметику з плаваючою крапкою"

Нулі в Java плаваючі та подвійні не просто представляють справжній нуль. Вони також використовуються як результат для будь-якого обчислення, точний результат якого має занадто малу величину, щоб бути представленим. У багатьох контекстах існує велика різниця між заниженням від’ємного числа та заниженням позитивного числа. Наприклад, якщо xє дуже малою величиною додатне число, 1/xмає бути позитивна нескінченність і 1/(-x)повинна бути негативною нескінченністю. Підписаний нуль зберігає знак результатів недотоку.


8

Канонічним посиланням на корисність підписаних нулів у плаваючій крапці є стаття Кахана " Відрізки галузей для складних елементарних функцій, або багато шуму з приводу нічого не знакового біта " (і деякі його доповіді на цю тему).

Коротка версія полягає в тому, що в досить поширених інженерних додатках інформація про знак, яка зберігається підписанням нуля, необхідна для отримання правильних рішень із числових методів. Знак нуля мало значення для більшості реальних операцій, але коли розглядаються комплексні функції або використовуються конформні відображення, знак нуля може раптово стати досить критичним.

Варто також зазначити, що оригінальний (1985 р.) IEEE-754Комітет розглядав і відхиляв підтримку проективного режиму операцій з плаваючою точкою, за якого існувала б лише одна беззнакова нескінченність (+/- 0 було б семантично ідентичним у такому режимі, так що навіть якби все-таки було два кодування, також був би лише один нуль).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.