Я только что обнаружил, что vim, очевидно, допускает деление на ноль:
:let a=42/0
:echo a
печатает 2147483647
(что является значением a
).
Это где-то задокументировано и почему vim допускает деление на ноль?
Я только что обнаружил, что vim, очевидно, допускает деление на ноль:
:let a=42/0
:echo a
печатает 2147483647
(что является значением a
).
Это где-то задокументировано и почему vim допускает деление на ноль?
Ответы:
Это поведение описано в разделе 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)
Вот почему:
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
Это поведение полезно в исчислении, когда используется то, что называется пределом.
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 не так много людей делает с ним гораздо больше, чем логика и целочисленная арифметика. Вполне возможно, что такое поведение в то время казалось хорошей идеей и на данный момент является просто устаревшим артефактом.
:echo 42/0.0
увидеть другой результат :)