Я щойно виявив, що 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 ^ + of 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
побачити інший результат :)