回答:
この動作は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
この動作は、Limitと呼ばれるものを使用するときにCalculusで役立ちます。
リムn-> 0 ^ + of 1 / n = + inf
これは次のように書くこともできます:As n-> 0 ^ +、1 / n-> + inf
このように読み取られます。nが右からゼロに近づくにつれて、関数1 / nは正の無限大に近づきます。
この推論の視覚的な説明を見るには、http://www.wolframalpha.com/input/?i = limit + n-%3E0 + of + 1%2Fnにアクセスして ください。
特にVim-scriptに関しては、多くの人がロジックと整数演算以上のことをしていません。この動作は、当時は良いアイデアのように見え、この時点では単なるレガシーアーティファクトである可能性があります。
:echo 42/0.0
別の結果を見てみてください:)