.NET примитивные дополнения типа? - PullRequest
2 голосов
/ 13 июля 2011

Мне было любопытно, поэтому я запустил пару тестов, чтобы увидеть, как .NET справляется с переполнением (я нигде не мог найти его документированным). Я бы почти хотел, чтобы они выкладывали ошибки переполнения вместо результатов, потому что, честно говоря, эти результаты просто причудливы:

  1. Int32.MaxValue + Int32.MaxValue = -2
    Я понимаю, что это оборачивается, но зачем делать это вместо создания OverflowException? Разве это не то, что "не проверено" для ... чтобы игнорировать переполнения? Я немного сбит с толку относительно того, что сейчас не проверено, тем более, что я видел, как оно использовалось для создания хеш-значений.

  2. Double.PositiveInfinity + Double.NegativeInfinity = Double.NaN
    Еще одна странность. 1 + -1 = 0. 100 + -100 = 0. Так почему же Infinity + -Infinity = NaN?

  3. Double.PositiveInfinity / Double.PositiveInfinity = Double.NaN
    Опять же, почему странность? Я бы подумал, что это должно быть 1 или, возможно, 0 (b / c предел x / Infinity = 0). На самом деле ... Double.MaxValue / Double.PositiveInfinity = 0 ...

  4. Double.PositiveInfinity / 0 = Infinity
    Какие!? Нет DivideByZeroException!?

  5. Double.MaxValue + Double.MaxValue = Infinity
    Да, этот не генерирует OverflowException, но также НЕ оборачивается? Так что я думаю, что не все примитивные типы ведут себя как int. Как ни странно, я могу делать такие вещи, как Double.MaxValue + 1 = 1.79769313486232E+308. Таким образом, добавление после MaxValue двойного возможно (вероятно, теряет точность?), Но после некоторого неизвестного числа (оно может быть выяснено - или уже есть) оно теряет способность отображать действительное число и возвращает Infininty?

Ну, остальное вроде как повторяющееся. Мне просто интересно, почему они работают так, как они? Особенно операторы Double. Это было очень неожиданно для меня, чтобы иметь возможность добавить помимо MaxValue.

Ответы [ 2 ]

5 голосов
/ 13 июля 2011
  1. Да; checked это исправит; unchecked является поведением по умолчанию
  2. Математически вы не можете добавлять + inf и -inf и не можете вывести знак. NaN - единственный разумный вариант; однако, + inf + + inf => + inf и -inf + -inf => -inf, как вы могли бы вывести
  3. Опять же, математически, это первая работа. Не в последнюю очередь, это привело бы к 2 * x / x => 1, что было бы хуже. Но в основном: inf не число
  4. Нет, они не; это ожидаемое поведение для плавающей запятой
  5. Float не переносится; превышение максимального значения - бесконечность
5 голосов
/ 13 июля 2011

Около 2/3

Бесконечность не число. Он также не действует как число.

Если мы допустим a число положительных чисел (1, 2, 3, ...), b число четных чисел (2, 4, 6, ...) и c будет числом нечетных целых чисел (1, 3, 5, ...). Совершенно очевидно, что и a, b и c - бесконечность.

Вы, вероятно, ожидаете, что a - a = 0, что в данном случае означает infinity - infinity = 0. Однако вы также можете ожидать a - b = c, поскольку c - это числа в a, которых нет в b. Это, однако, дает нам, что infinity - infinity = infinity.

Правильно построив свои бесконечности, вы можете получить любое целое число в качестве ответа для infinity - infinity. Поэтому нет смысла давать ему правильное определение, поэтому мы допускаем, чтобы оно было NaN или «Не число».

То же самое касается деления, то есть пункта 3.

...