首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么整数和小数抛出DivideByZeroException,而浮点不抛出?

为什么整数和小数抛出DivideByZeroException,而浮点不抛出?
EN

Stack Overflow用户
提问于 2013-09-15 12:59:44
回答 3查看 988关注 0票数 6

根据http://msdn.microsoft.com/en-us/library/system.dividebyzeroexception.aspx,只有整数和小数在除以0时会抛出DivideByZeroException,但是当你将浮点数除以0时,结果是无穷大、负无穷大或NaN。为什么会这样呢?结果是+ve infinity,-ve infinity,或者NaN的例子是什么?

EN

回答 3

Stack Overflow用户

发布于 2013-09-15 13:13:35

IEEE标准委员会felt that exception handling was more trouble than it was worth,针对可能遇到浮点数学的这类问题的代码范围:

陷阱可用于停止程序,但无法恢复的情况极为罕见。

..。

标志提供了可预测的控制流和速度。它们的使用要求程序员意识到异常情况,但标记粘性允许程序员延迟处理异常情况,直到必要时。

对于习惯了异常处理的语言的开发人员来说,这可能看起来很奇怪,比如C#。IEEE754标准的开发人员正在考虑更广泛的实现(例如,嵌入式系统),在这些实现中,这样的功能不可用或不可取。

票数 11
EN

Stack Overflow用户

发布于 2013-09-15 23:07:36

迈克尔的答案当然是正确的。这是另一种看待它的方式。

整数是精确的。当你将7除以3的整数时,你实际上是在问这样一个问题:“我可以从7中减去多少次3,才能变成负数?”除以零是没有定义的,因为你没有次数可以从7中减去0来得到负数。

浮点数本质上是不精确的。它们有一定的精确度,你最好假设“真实”的数量介于给定的浮点数和它附近的浮点数之间。此外,浮点数通常表示物理量,并且那些测量误差远远大于表示误差的浮点数。我认为浮动是一个围绕着一个点的模糊模糊区域。

所以当你在浮点数中用七除零时,可以把它看作是用合理地接近于零的数除以某个合理地接近于7的数。显然,一个合理地接近于零的数字可以使商任意大!因此,这是通过给出无穷大作为答案来向你发出信号的;这意味着答案可能是任意大的,这取决于真值实际所在的位置。

票数 7
EN

Stack Overflow用户

发布于 2013-09-16 00:16:21

内置于处理器中的浮点引擎非常有能力为浮点数除以零生成异常。Windows有一个专门的异常代码,STATUS_FLOAT_DIVIDE_BY_ZERO,异常代码0xC000008E,“浮点除以零”。以及FPU可以报告的其他事故,如溢出、下溢和不准确的结果(也称为非正规化)。

它是否这样做是由控制寄存器决定的,程序可以使用_controlfp()之类的辅助函数来更改此寄存器。例如,使用Borland工具创建的库通常会这样做,从而揭开这些异常的面纱。

温和地说,这并没有很好地发挥作用。它是你能想象到的最糟糕的全局变量。将这样的库与其他期望被零除以生成无穷大而不是异常的库混合在一起是不起作用的,几乎是不可能处理的。

因此,现在语言运行时屏蔽所有浮点异常是一种规范。CLR也坚持这一点。

处理一个揭开异常的库是很棘手的,但是有一个愚蠢的解决办法。您可以抛出异常并再次捕获它。CLR内的异常处理代码重置控制寄存器。在this answer中显示了一个这样的示例。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18809074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档