:let a=42/0
:echo a
打印
2147483647
(这是a
的值)。这已记录在案。为什么vim允许除以零?
#1 楼
此行为记录在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)
#2 楼
这就是为什么: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
部分得到了确认(意思是:@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
评论
在那种情况下,为什么负数除以0而不是最小值? ->vi.stackexchange.com/questions/4623/…
–雅各布·克拉尔(Jacob Krall)
2015年9月2日在21:51
我已经编辑了我的问题
– nobe4
2015年9月3日在6:30
2147483647当然比无穷大更接近于零。因此,用这么小的数字表示无穷大似乎没有帮助,至少对我而言没有。
–RenéNyffenegger
2015年9月4日在13:43
#3 楼
当使用名为Limit的东西时,此行为在微积分中非常有用。Lim n-> 0 ^ + of 1 / n = + inf
也可以写成:
当n-> 0 ^ +,1 / n-> + inf
这样读..
当n从右边接近零时,函数1 / n接近正无穷大。
要查看对此推理的直观解释,请跳至
http://www.wolframalpha.com/input/?i=limit+n-%3E0 + of + 1%2Fn
就Vim脚本而言,AFIAK的人除逻辑和整数运算外没有其他很多事情。可能的情况是,这种行为在当时似乎是个好主意,目前还只是一个遗留的工件。
评论
您有最后一段的资料吗?在C中未定义整数除以零,您看到的任何行为都取决于处理器等。
–muru
2015年9月6日在16:13
哦,对了。我要删除该段。
– Shane
2015年9月6日18:32
评论
尝试:echo 42 / 0.0以查看其他结果:)