划分为0异常

时间:2015-03-25 19:25:30

标签: c#

我遇到了这个question in Math Stack Exchnage,它将数字除以0。

现在,关于x/0accepted answer表示:

  

由于没有方程式的解,所以没有" x / 0"。所以x / 0不代表任何数字。

因此,在C#中实现此功能,如果我们将数字(double)除以0.0,则结果为NaN。但是,它会显示infinity

另一方面,对于操作0.0 / 0.0,它写道:

  

这里的问题是等式0z = 0具有z的任何值作为解(这是"无限解"意味着什么)。

但是,在C#中执行此操作时,结果为NaN

为什么这种行为在C#中相反?他们在实施时犯了错误吗?

Here is a working fiddle to demonstrate that.

5 个答案:

答案 0 :(得分:2)

实际上,通过“无限解”,它们意味着任何给定的数字都是等式的解,因此,解决方案不适用。

然而,当你将非零常数除以零时,答案确实会变为(±)无穷大。我懒得解释微积分,所以看看这个:www.wolframalpha.com/input/?i=lim+1/x+as+x+approaches+0

答案 1 :(得分:2)

有各种不是数字的值,正/负无穷大是两个不是数字的特定值。 (另一个是负面的平方根。)这个模型。

当然并非所有特定的非数字值都有自己的double值,因此那些没有被特别表示的人被包装在标有NaN的桶中,只是“所有其他”非数字值“。它不是一个超级详细的模型,因为没有列出所有特定的非数字值,但它肯定不是一个根本不同的模型。

答案 2 :(得分:1)

您提到的问题包含标记algebra-precalculusarithmetic

而数学的calculus部分定义了C#实现的数字行为。

所以答案对于它所要求的领域是正确的。

答案 3 :(得分:0)

好吧,如果我们谈论实数,那么表达式'x / 0'就没有真正的解决方案。现在,在数学上我们可以移动到一组不同的数字,例如real projective line,其中0 的除法是

你真正发现的是,double(或大多数浮点值)代表的数字集是实数集。因此,关于实数的通常规则并不真正适用于这种直接的方式。因此,以这种方式定义除法是完全可以接受的。甚至是数学上的。

答案 4 :(得分:0)

来自:Gnu

IEEE 754浮点数可以表示正或负无穷大,以及NaN(不是数字)。这三个值来自计算,其结果未定义或无法准确表示。您还可以故意为其中任何一个设置浮点变量,这有时很有用。产生无穷大或NaN的计算的一些例子:

1/0 = ∞
log (0) = -∞
sqrt (-1) = NaN

当计算产生任何这些值时,也会发生异常;见FP Exceptions。

基本操作和数学函数都接受无穷大和NaN并产生合理的输出。无穷大如人们所期望的那样通过计算传播:例如,2 +∞=∞,4 /∞= 0,atan(∞)=π/ 2。另一方面,NaN会感染任何涉及它的计算。除非计算产生相同的结果,无论实际值是否取代NaN,结果都是NaN。

在比较操作中,正无穷大大于除自身和NaN之外的所有值,负无穷大小于除自身和NaN之外的所有值。 NaN是无序的:它不等于,大于或小于任何东西,包括它自己。如果x的值是NaN,则x == x为假。您可以使用它来测试值是否为NaN,但是测试NaN的推荐方法是使用isnan函数(请参阅浮点类)。此外,<,>,< =和> =会在应用于NaN时引发异常。

math.h定义了允许您将变量显式设置为无穷大或NaN的宏。

宏:浮动INFINITY 表示正无穷大的表达式。它等于1.0 / 0.0等数学运算产生的值。 -INFINITY表示负无穷大。

通过将浮点值与此宏进行比较,可以测试浮点值是否为无限值。但是,不建议这样做;你应该使用isfinite宏代替。请参阅浮点类。

此宏已在ISO C99标准中引入。

宏:浮动NAN 表示“非数字”的值的表达式。此宏是GNU扩展,仅在支持“非数字”值的计算机上可用 - 也就是说,在所有支持IEEE浮点的计算机上都可用。

您可以使用'#ifdef NAN'来测试机器是否支持NaN。 (当然,您必须安排GNU扩展可见,例如通过定义_GNU_SOURCE,然后您必须包含math.h。)

IEEE 754还允许另一个不寻常的值:负零。将正数除以负无穷大,或者当负结果小于表示限制时,会产生此值。