2015-03-25 2 views
0

Я столкнулся с этой question in Math Stack Exchnage который относительно деления чисел 0.Деление на 0 аномалией

Теперь, что касается x/0, то accepted answer утверждает, что:

Поскольку нет решения уравнения, нет такой вещи, как «x/0». Таким образом, x/0 не представляет никакого числа.

Таким образом, реализуя это в C#, если мы разделим число (double) по 0.0, это должно привести в NaN. Однако он показывает infinity.

С другой стороны, для операции 0.0/0.0, это написано, что:

здесь проблема в том, что уравнение 0z = 0 имеет любое значение г в виде раствора (это то, что «бесконечные решения» означает).

Однако, делая это в C#, это результат NaN.

Почему это поведение противоположно в C#? Они допустили ошибку при ее реализации?

Here is a working fiddle to demonstrate that.

+5

«это должно получиться как NaN» --- на чем основана это утверждение? Поведение C# довольно похоже на математику. – zerkms

+0

Проверьте этот ответ (другой вопрос): http: // stackoverflow.com/a/14244726/2359643 или этот http://stackoverflow.com/a/15117594/2359643 – JNYRanger

+7

C# просто следует спецификациям IEEE. – Servy

ответ

2

Существуют все виды значений, которые не являются числами, а положительная/отрицательная бесконечность - это два конкретных значения, которые не являются числами. (Другой - квадратный корень отрицательного.) Это моделирует это.

Конечно, не все конкретные нечисловые значения имеют собственное значение double, поэтому те, которые не были запрограммированы специально, были обернуты в ведро с пометкой NaN, чтобы просто быть «всеми другими нечисловыми значениями». Это не супер подробная модель, так как есть не все, что указано в некоторых конкретных нечисловых значениях, но это, безусловно, не принципиально другая модель.

+0

'double.IsNaN', похоже, специально проверяется на' double.NaN'. Например. 'double.IsNaN (double.PositiveInfinity)' вернет 'false'. Аналогично для 'double.NegativeInfinity'. Если вы хотите проверить не реальные значения, вам нужно будет сделать что-то вроде '! Double.IsInfinity (x) &&! Double.IsNaN (x)' – Kyle

1

Вопрос, который вы имеете в виду есть теги algebra-precalculus, arithmetic.

В то время как раздел математики, определяющий поведение чисел, выполняемых C#, находится в разделе calculus.

Так что ответ правильный для поля, в котором оно было задано.

2

Фактически, под «бесконечными решениями» подразумевается, что любое заданное число является решением уравнения, и поэтому решение не применимо.

Однако, если вы делите ненулевую константу на ноль, ответ действительно перейдет к (±) бесконечности. Я слишком ленив, чтобы объяснить исчисление, так что взгляните на это: www.wolframalpha.com/input/?i=lim+1/x+as+x+approaches+0

0

Ну, если мы говорим о реальных числах, то выражение «x/0» не имеет реального решения. Теперь математически мы могли перейти к другому набору чисел, например real projective line, в котором деление на 0 определено.

Так на самом деле то, что вы обнаружили, является то, что множество чисел, представленных в double (или большинство любых значений с плавающей точкой) является не множество действительных чисел. Таким образом, обычные правила о реальных числах действительно не применяются таким прямым способом. По этой причине вполне приемлемо определять деление таким образом. Даже математически.

0

От: Gnu

IEEE 754 числа с плавающей точкой могут представлять положительную или отрицательную бесконечность, и NaN (не число). Эти три значения возникают из расчетов, результат которых не определен или не может быть представлен точно. Вы также можете преднамеренно установить переменную с плавающей запятой любому из них, что иногда полезно.Некоторые примеры расчетов, которые производят бесконечность или NaN:

1/0 = ∞ 
log (0) = -∞ 
sqrt (-1) = NaN 

Когда расчет производит любое из этих значений, возникает исключение; см. Исключения FP.

Основные операции и математические функции принимают бесконечность и NaN и обеспечивают разумный выход. Бесконечность распространяется по расчетам, как и следовало ожидать: например, 2 + ∞ = ∞, 4/∞ = 0, atan (∞) = π/2. NaN, с другой стороны, заражает любые вычисления, которые его включают. Если расчет не привел бы к такому же результату, независимо от того, какая реальная стоимость заменила NaN, результатом будет NaN.

В сравнительных операциях положительная бесконечность больше всех значений, кроме самого себя и NaN, а отрицательная бесконечность меньше всех значений, кроме самого себя и NaN. NaN неупорядочен: он не равен, больше или меньше чем что-либо, включая себя. x == x является ложным, если значение x равно NaN. Вы можете использовать это, чтобы проверить, является ли значение NaN или нет, но рекомендуемый способ тестирования для NaN - с функцией isnan (см. Классы с плавающей точкой). Кроме того, <,>, < =, и> = вызовет исключение при применении к NaN.

math.h определяет макросы, которые позволяют явно установить переменную в бесконечность или NaN.

Macro: float INFINITY Выражение, представляющее положительную бесконечность. Он равен значению, создаваемому математическими операциями типа 1.0/0.0. -INFINITY представляет собой отрицательную бесконечность.

Вы можете проверить, является ли значение с плавающей запятой бесконечным, сравнивая его с этим макросом. Однако это не рекомендуется; вместо этого вы должны использовать isfinite macro. См. Классы с плавающей точкой.

Этот макрос был представлен в стандарте ISO C99.

Macro: float NAN Выражение, представляющее значение, которое не является числом. Этот макрос является расширением GNU, доступным только на машинах, которые поддерживают значение «не числа», то есть на всех машинах, поддерживающих плавающую точку IEEE.

Вы можете использовать '#ifdef NAN', чтобы проверить, поддерживает ли машина NaN. (Разумеется, вы должны устраивать расширения GNU, например, путем определения _GNU_SOURCE, а затем вы должны включить math.h.)

IEEE 754 также допускает другое необычное значение: отрицательный ноль. Это значение получается, когда вы делите положительное число на отрицательную бесконечность или когда отрицательный результат меньше пределов представления.

Смежные вопросы