Warum erlaubt vim eine Ganzzahldivision durch Null?


15

Ich habe gerade herausgefunden, dass vim offensichtlich die Division durch Null erlaubt:

:let a=42/0
:echo a

druckt 2147483647(das ist der Wert von a).

Ist dies irgendwo dokumentiert und warum erlaubt vim die Division durch Null?


2
Versuchen Sie :echo 42/0.0, ein anderes Ergebnis zu sehen :)
VanLaser

Antworten:


8

Dieses Verhalten ist im Abschnitt eval dokumentiert :

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

Hier ist warum:

42 / 0 tends to +infinity

Und wie repräsentiert Vim die größte verfügbare Anzahl?

2147483647

Sehen :h limits

Darüber hinaus heißt es in der float2nrFunktionsdokumentation:

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

Sie haben also hier Ihre 2 Nummern: + 2147483647und - 2147483647.

Die letzte Zahl -2147483648wird zur Darstellung des NaNWertes verwendet.

Dies wird durch den evalAbschnitt darauf bestätigt (mea culpa: @cuonglm hat es direkt vor mir gepostet ):

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)

Wie @VanLaser feststellte, funktioniert dies nur für Ganzzahlen, für Gleitkommazahlen haben Sie mehr Konsistenz:

 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

Warum ist in diesem Fall die Division einer negativen Zahl durch 0 nicht die Mindestzahl? -> vi.stackexchange.com/questions/4623/…
Jacob Krall

Ich habe meine Frage bearbeitet
nobe4

2147483647 ist sicherlich viel näher an null als an unendlich. Unendlichkeit mit so einer kleinen Zahl darzustellen, scheint mir also nicht hilfreich, zumindest nicht.
René Nyffenegger

2

Dieses Verhalten ist in Calculus nützlich, wenn Sie ein Limit verwenden.

Lim n -> 0 ^ + von 1 / n = + inf

Dies kann auch geschrieben werden als: As n -> 0 ^ +, 1 / n -> + inf

Es wird so gelesen. Wenn n von rechts gegen Null geht, nähert sich die Funktion 1 / n der positiven Unendlichkeit.

Um eine visuelle Erklärung für diese Argumentation zu erhalten, rufen Sie http://www.wolframalpha.com/input/?i=limit+n-%3E0+of+1%2Fn auf

Was speziell Vim-Script betrifft, machen AFAIK nicht viele Leute viel mehr als Logik und Ganzzahlarithmetik damit. Es könnte der Fall sein, dass dieses Verhalten zu dieser Zeit als gute Idee erschien und zu diesem Zeitpunkt lediglich ein altes Artefakt ist.


Haben Sie eine Quelle für den letzten Absatz? Ganzzahlige Division durch Null ist in C undefiniert, jedes Verhalten, das Sie sehen, ist abhängig vom Prozessor usw.
muru

Oh, du hast Recht. Ich entferne den Absatz.
Shane
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.