Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查Double是否为“的最短方法”;“南”;_C#_.net_Floating Point - Fatal编程技术网

C# 检查Double是否为“的最短方法”;“南”;

C# 检查Double是否为“的最短方法”;“南”;,c#,.net,floating-point,C#,.net,Floating Point,使用Double.PositiveInfinity作为参数调用Double.IsNaN()时,结果为false。这与我的直觉相反,因为无限不是一个数字。显然,“NaN”只存在于.NET中的常量中,这是由IEEE标准描述的还是自定义的实现细节?是否有比以下方法更快捷的方法检查双精度是否为“NaN”: 或 正如MSDN所说,这意味着结果是未定义的。对于无穷大,结果定义为: 当操作结果为空时,方法或运算符返回NaN 未定义。例如,将0除以0的结果为NaN,如下所示: 下面的示例显示。(但请注意,除以一

使用
Double.PositiveInfinity
作为参数调用
Double.IsNaN()
时,结果为false。这与我的直觉相反,因为无限不是一个数字。显然,“NaN”只存在于.NET中的常量中,这是由IEEE标准描述的还是自定义的实现细节?是否有比以下方法更快捷的方法检查双精度是否为“NaN”:

正如MSDN所说,这意味着结果是未定义的。对于无穷大,结果定义为:

当操作结果为空时,方法或运算符返回NaN 未定义。例如,将0除以0的结果为NaN,如下所示: 下面的示例显示。(但请注意,除以一个非零的数字 按零返回正整数或负整数,具体取决于 在除数的符号上。)

所以,把无限看成NaN不是个好主意。您可以编写扩展方法来检查值是否不是NaN或无穷大:

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

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

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

double
IsFinite()
方法检查double是否为有限数(不是
NaN
无穷大
):


请参阅和中的源代码。如果希望
double
的值始终是一个数字,可以使用此
FiniteOrDefault
扩展名。当然,它的灵感来自于


除非您只创建自己的自定义包装函数,否则不会期望它变得更短。IEEE标准yes中描述了NaN(事实上,它稍微复杂一些,有相当多的NaN和信令NaN)。它是一个浮点数的可能值,而不是一个类别“除了普通的旧数以外的任何东西”。我很少遇到NaN和无穷大应该以同样的方式处理的情况。许多计算工作正常,得到有意义的结果,数据中有无穷多个。在广泛使用IsNanOrInfinity函数之前,请仔细检查它对您的计算是否有意义。@PatriciaShanahan-幸运的是,我没有做任何浮点计算。我正在验证两个Double,它们表示介于
Double.MinValue
Double.MaxValue
之间的范围。据我所知,他们两个都是NaN是没有意义的。你能接受Roman Marusyk的正确答案吗?对于.NET5以后的版本,公认的答案已经过时了。使用扩展方法是非常简洁的。我想没有比这更好的了。
HasValue
可能会误导我,因为无限是一个值。@Mario同意,这就是为什么另一个建议的名称是
IsNanOrInfinity
@SergeyBerezovskiy:
IsFinite
是一个常见的约定。
(Double.IsNaN(d) || Double.IsInfinity(d))
// Or IsNanOrInfinity
public static bool HasValue(this double value)
{
    return !Double.IsNaN(value) && !Double.IsInfinity(value);
}
double.IsFinite(d)
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()
};