Почему vim допускает целочисленное деление на ноль?


16

Я только что обнаружил, что vim, очевидно, допускает деление на ноль:

:let a=42/0
:echo a

печатает 2147483647(что является значением a).

Это где-то задокументировано и почему vim допускает деление на ноль?


2
Попробуйте :echo 42/0.0увидеть другой результат :)
VanLaser

Ответы:


9

Это поведение описано в разделе eval :

When dividing a Number by zero the result depends on the value:
      0 / 0  = -0x80000000  (like NaN for Float)
     >0 / 0  =  0x7fffffff  (like positive infinity)
     <0 / 0  = -0x7fffffff  (like negative infinity)
    (before Vim 7.2 it was always 0x7fffffff)

15

Вот почему:

42 / 0 tends to +infinity

И как Vim представляет наибольшее число доступных?

2147483647

Видеть :h limits

Кроме того, в float2nrдокументации по функциям говорится:

When the value of {expr} is out of range for a |Number| the
result is truncated to 0x7fffffff or -0x7fffffff.  NaN results
in -0x80000000.

Итак, у вас есть 2 номера: + 2147483647а - 2147483647.

Последнее число -2147483648используется для представления NaNзначения.

Это подтверждается в evalразделе об этом (mea culpa: @cuonglm разместил его прямо передо мной):

When dividing a Number by zero the result depends on the value:
    0 / 0  = -0x80000000    (like NaN for Float)
   >0 / 0  =  0x7fffffff    (like positive infinity)
   <0 / 0  = -0x7fffffff    (like negative infinity)

Как сказал @VanLaser, это работает только для целых чисел, для числа с плавающей запятой у вас больше согласованности:

 1/0.0     =  inf
 1/0.0 + 1 =  inf
 1/0.0 - 1 =  inf

-1/0.0     = -inf
-1/0.0 - 1 = -inf
-1/0.0 + 1 = -inf

В таком случае, почему деление отрицательного числа на 0 не является минимальным числом? -> vi.stackexchange.com/questions/4623/…
Джейкоб Кралл,

Я отредактировал свой вопрос
nobe4

2147483647, конечно, гораздо ближе к нулю, чем к бесконечности. Таким образом, представлять бесконечность с таким небольшим числом не кажется полезным, по крайней мере, мне.
Рене Ниффенеггер,

2

Это поведение полезно в исчислении, когда используется то, что называется пределом.

Lim n -> 0 ^ + из 1 / n = + inf

Это также можно записать так: как n -> 0 ^ +, 1 / n -> + inf

Читается так ... Когда n приближается к нулю справа, функция 1 / n приближается к положительной бесконечности.

Чтобы увидеть наглядное объяснение этого рассуждения, перейдите на http://www.wolframalpha.com/input/?i=limit+n-%3E0+of+1%2Fn

Что касается Vim-скрипта, AFAIK не так много людей делает с ним гораздо больше, чем логика и целочисленная арифметика. Вполне возможно, что такое поведение в то время казалось хорошей идеей и на данный момент является просто устаревшим артефактом.


У вас есть источник для последнего абзаца? Целочисленное деление на ноль в C не определено, любое поведение, которое вы видите, зависит от процессора и т. Д.
Muru

О, ты прав. Я удаляю абзац.
Шейн
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.