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

时间:2014-07-11 12:15:42

标签: c# .net floating-point

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

(Double.IsNaN(d) || Double.IsPositiveInfinity(d) || Double.IsNegativeInfinity(d))

(Double.IsNaN(d) || Double.IsInfinity(d))

4 个答案:

答案 0 :(得分:49)

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

  

当操作结果为时,方法或运算符返回NaN   未定义。例如,将零除零的结果是NaN,as   以下示例显示。 (但请注意除以非零数字   由零返回PositiveInfinity或NegativeInfinity,具体取决于   在除数的标志上。)

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

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

答案 1 :(得分:2)

Double类型中有三个特殊值,它基于IEEE standard 754。一个是正​​无穷大,另一个是负无穷大,最后一个是非数字(NaN)。 Double.IsNaN方法所做的就是检查变量中的值是否是这个特殊的NaN值。

答案 2 :(得分:2)

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

double具有IsFinite()方法来检查双精度数是否为有限数(不是NaN还是Infinity):

double.IsFinite(d)

请参见.Net Framework.Net Core中的源代码

答案 3 :(得分:0)

如果您希望double的值始终是数字,则可以使用此FiniteOrDefault扩展名。当然,它的灵感来自Sergey Berezovskiy's answer

public static bool HasValue(this double value)
{
    return !double.IsNaN(value) && !double.IsInfinity(value);
}

/// <summary>
/// Returns zero when double is NaN or Infinte
/// </summary>
public static double FiniteOrDefault(this double value)
{
    return value.HasValue() ? value : default;
}

有了它,下面的代码将更具可读性:

Rect dimensions = new Rect
{
    X = Canvas.GetLeft(Control).FiniteOrDefault(),
    Y = Canvas.GetTop(Control).FiniteOrDefault(),
    Width = Control.ActualWidth.FiniteOrDefault(),
    Height = Control.ActualHeight.FiniteOrDefault()
};