检查Double是否为"NaN"的最短方式

Leo*_*ger 35 .net c# floating-point

Double.IsNaN()使用Double.PositiveInfinityas参数调用时,结果为false.这是违背我的直觉的,因为无穷大不是一个数字.显然"NaN"只存在于.NET中的常量,是IEEE标准描述的还是自定义实现细节?是否有更短的方法来检查a Double是否为"NaN"而不是:

(Double.IsNaN(d) || Double.IsPositiveInfinity(d) || Double.IsNegativeInfinity(d))
Run Code Online (Sandbox Code Playgroud)

要么

(Double.IsNaN(d) || Double.IsInfinity(d))
Run Code Online (Sandbox Code Playgroud)

Ser*_*kiy 55

正如MSDN所说,NaN意味着结果未定义.无穷大的结果定义如下:

当操作结果未定义时,方法或运算符返回NaN.例如,将零除零的结果是NaN,如以下示例所示.(但请注意,将非零数除以零会返回PositiveInfinity或NegativeInfinity,具体取决于除数的符号.)

因此,将无穷大视为NaN并不是一个好主意.您可以编写扩展方法来检查值是否不是NaN或无穷大:

// Or IsNanOrInfinity
public static bool HasValue(this double value)
{
    return !Double.IsNaN(value) && !Double.IsInfinity(value);
}
Run Code Online (Sandbox Code Playgroud)

  • @SergeyBerezovskiy:`IsFinite`是一个常见的惯例. (4认同)
  • 我想“HasValue”会产生误导,因为无穷大**是**一个值。 (2认同)
  • @Mario同意,这就是为什么另一个建议的名字是'IsNanOrInfinity` (2认同)

Rom*_*syk 7

您不再需要 SergeyBerezovskiy 回答的扩展名。

doubleIsFinite()方法检查双精度数是否为有限数(不是NaNInfinity):

double.IsFinite(d)
Run Code Online (Sandbox Code Playgroud)

查看.Net Framework.Net Core 中的源代码