Właśnie odkryłem, że vim oczywiście pozwala na dzielenie przez zero:
:let a=42/0
:echo a
drukuje 2147483647
(co jest wartością a
).
Czy jest to gdzieś udokumentowane i dlaczego vim pozwala na dzielenie przez zero?
Właśnie odkryłem, że vim oczywiście pozwala na dzielenie przez zero:
:let a=42/0
:echo a
drukuje 2147483647
(co jest wartością a
).
Czy jest to gdzieś udokumentowane i dlaczego vim pozwala na dzielenie przez zero?
Odpowiedzi:
To zachowanie jest udokumentowane w części 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)
Oto dlaczego:
42 / 0 tends to +infinity
A w jaki sposób Vim reprezentuje największą dostępną liczbę?
2147483647
Widzieć :h limits
Ponadto float2nr
dokumentacja funkcji stanowi:
When the value of {expr} is out of range for a |Number| the
result is truncated to 0x7fffffff or -0x7fffffff. NaN results
in -0x80000000.
Więc masz tutaj swoje 2 liczby: + 2147483647
i - 2147483647
.
Ostatni numer -2147483648
służy do przedstawienia NaN
wartości.
Potwierdza to eval
sekcja na nim (mea culpa: @cuonglm opublikowała go tuż przed mną):
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)
Jak stwierdził @VanLaser, działa to tylko dla liczb całkowitych, dla liczb zmiennoprzecinkowych masz większą spójność:
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
To zachowanie jest przydatne w rachunku różniczkowym, gdy używa się czegoś zwanego Limitem.
Lim n -> 0 ^ + z 1 / n = + inf
Można to również zapisać jako: As n -> 0 ^ +, 1 / n -> + inf
Czyta się tak. Gdy n zbliża się do zera z prawej, funkcja 1 / n zbliża się do dodatniej nieskończoności.
Aby zobaczyć wizualne wyjaśnienie tego rozumowania, przejdź do strony http://www.wolframalpha.com/input/?i=limit+n-%3E0+of+1%2Fn
Jeśli chodzi o skrypt Vim, AFAIK niewiele osób robi z nim więcej niż logikę i arytmetykę liczb całkowitych. Może się zdarzyć, że takie zachowanie wydawało się w tamtym czasie dobrym pomysłem i jest w tym momencie jedynie artefaktem spuścizny.
:echo 42/0.0
zobaczyć inny wynik :)