我只是发现vim显然允许除以零:

:let a=42/0
:echo a


打印2147483647(这是a的值)。

这已记录在案。为什么vim允许除以零?

评论

尝试:echo 42 / 0.0以查看其他结果:)

#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