.NET中的NaN号错误的Math.Pow()实现

时间:2018-08-27 10:31:14

标签: c# .net math

为什么Math.Pow(1.0, double.NaN)命令返回NaN而不是正确的1.0?我了解NaN是一个不确定的值(数学上),它代表所有实数,包括正无穷大。 对于所有这些值,该表达式在数学上始终正确,等于1.0。

例如Python具有它,并且1**float("nan") == 1True,符合IEEE标准:

  

对于任何y值(包括NaN),如果x为+1,则应返回1.0。

4 个答案:

答案 0 :(得分:4)

任何使用NaN的操作都将返回NaN,因此Math.Pow(1.0, double.Nan)将返回NaN。在C#中使用NaN时,这是预期的行为。

  

具有NaN值的方法调用或对NaN值的操作返回   NaN

See Here

仅仅因为一种语言以某种方式表现并不一定意味着另一种语言会以这种方式表现

编辑:供将来参考,Math.Pow(1.0, double.PositiveInfinity)确实给了您一个,我想这就是您想要的。查看有关使用NaN的语言的文档。如果要使用正和负无穷大,请使用double.PostiveInfinititydouble.NegativeInfinity,因为NaN不代表这些值。

答案 1 :(得分:2)

NegativePositive的无限性有特定的表示形式,因此无论NaN是什么,它都不能表示这些。

文档中给出的可以生成NaN的表达式的示例为0.0/0.0。不管结果是什么,它都不是您所断言的某些“不确定的实数”。


而不是假设Math.Pow一定会承诺遵循另一种语言或标准的约定(正如您在问题中所链接的那样),您应该查看其自己的文档,该文档专门说明其在{ {1}} s:

NaN

以上是“备注”部分中表格的第一行。下表显示在表格的下方:

Parameters        Return value
x or y = NaN.     NaN

答案 2 :(得分:0)

NaN代表“不是数字”,所以NaN返回在我看来似乎是正确的。

答案 3 :(得分:0)

这是理想的行为。您可能会认为Math.Pow(1, double.NaN)返回1是合理的选择,当涉及字符串字面量时,您可以提出一个对您有利的论点,但是恕我直言,如果发生以下情况:

var i = Whatever();
var d = SomeRatherDifficultOperationYouDidntImplement();
var result = Math.Pow(i, d);

为什么要返回1?也许dNaN是不应该发生的事情;您在这里吞下了一个潜在的错误。 NaN应该始终传播,很有可能以前的某些计算在某个地方出错了。

如果您有一个特定的场景,其中Math.Pow(1, double.NaN)需要为1,则对该情况使用特定的代码并对其进行注释,以便明确其指定的和必需的行为。