Dlaczego vim pozwala na dzielenie liczb całkowitych przez zero?

16

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?

René Nyffenegger
źródło
2
Spróbuj :echo 42/0.0zobaczyć inny wynik :)
VanLaser

Odpowiedzi:

9

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)
Cuonglm
źródło
15

Oto dlaczego:

42 / 0 tends to +infinity

A w jaki sposób Vim reprezentuje największą dostępną liczbę?

2147483647

Widzieć :h limits

Ponadto float2nrdokumentacja 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: + 2147483647i - 2147483647.

Ostatni numer -2147483648służy do przedstawienia NaNwartości.

Potwierdza to evalsekcja 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
nobe4
źródło
W takim razie dlaczego podział liczby ujemnej przez 0 nie jest liczbą minimalną? -> vi.stackexchange.com/questions/4623/…
Jacob Krall
Zredagowałem swoje pytanie
nobe4
2147483647 z pewnością jest znacznie bliższy zeru niż nieskończoności. Zatem reprezentowanie nieskończoności przy tak małej liczbie nie wydaje się pomocne, przynajmniej nie dla mnie.
René Nyffenegger,
2

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.

Shane
źródło
Czy masz źródło ostatniego akapitu? Dzielenie liczb całkowitych przez zero jest niezdefiniowane w C, każde zachowanie, które widzisz, zależy od procesora itp.
muru
Masz rację. Usuwam akapit.
Shane