Pourquoi vim permet-il une division entière par zéro?

16

Je viens de découvrir que vim permet évidemment la division par zéro:

:let a=42/0
:echo a

imprime 2147483647(qui est la valeur de a).

Est-ce documenté quelque part et pourquoi vim permet-il la division par zéro?

René Nyffenegger
la source
2
Essayez :echo 42/0.0de voir un autre résultat :)
VanLaser

Réponses:

9

Ce comportement est documenté dans la section 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
la source
15

Voici pourquoi:

42 / 0 tends to +infinity

Et comment Vim représente le plus grand nombre disponible?

2147483647

Voir :h limits

De plus, la float2nrdocumentation de la fonction indique:

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

Vous avez donc ici vos 2 numéros: + 2147483647et - 2147483647.

Le dernier nombre -2147483648est utilisé pour représenter la NaNvaleur.

Ceci est confirmé par la evalsection à ce sujet (mea culpa: @cuonglm l'a posté juste avant moi):

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)

Comme l'a indiqué @VanLaser, cela ne fonctionne que pour les nombres entiers, pour le nombre à virgule flottante, vous avez plus de cohérence:

 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
la source
Dans ce cas, pourquoi la division d'un nombre négatif par 0 n'est-elle pas le nombre minimum? -> vi.stackexchange.com/questions/4623/…
Jacob Krall
J'ai édité ma question
nobe4
2147483647 est certainement beaucoup plus proche de zéro que de l'infini. Donc, représenter l'infini avec un si petit nombre ne semble pas utile, du moins pas pour moi.
René Nyffenegger
2

Ce comportement est utile dans le calcul lorsque vous utilisez quelque chose appelé une limite.

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

Cela peut aussi s'écrire: As n -> 0 ^ +, 1 / n -> + inf

Elle se lit ainsi. Comme n s'approche de zéro par la droite, la fonction 1 / n s'approche de l'infini positif.

Pour voir une explication visuelle de ce raisonnement, passez à http://www.wolframalpha.com/input/?i=limit+n-%3E0+of+1%2Fn

En ce qui concerne le script Vim en particulier, AFAIK peu de gens en font beaucoup plus que la logique et l'arithmétique entière. Il pourrait être le cas que ce comportement semblait être une bonne idée à l'époque, et n'est simplement qu'un artefact hérité à ce stade.

Shane
la source
Avez-vous une source pour le dernier paragraphe? La division entière par zéro n'est pas définie en C, tout comportement que vous voyez dépend du processeur, etc.
muru
Oh, tu as raison. J'enlève le paragraphe.
Shane