C# 何时使用NaN或+/-无穷

C# 何时使用NaN或+/-无穷,c#,nan,infinity,C#,Nan,Infinity,对于float和double,PositiveInfinity或NegativeInfinity有什么好处?我们应该什么时候使用或避免它们 如果有这样的常量,为什么float.Parse(“a”)抛出错误而不是返回float.NaN NaN与null有何不同?为什么浮动类型也可以用除零?与其说它们是您使用的东西,不如说它们是您需要注意的东西: double hmm = 1.0 / 0.0; double hmm2 = -1.0 / 0.0; double hmm3 = 0.0 / 0.0; Co

对于
float
double
PositiveInfinity
NegativeInfinity
有什么好处?我们应该什么时候使用或避免它们

如果有这样的常量,为什么
float.Parse(“a”)
抛出错误而不是返回
float.NaN


NaN
null
有何不同?为什么浮动类型也可以用除零?

与其说它们是您使用的东西,不如说它们是您需要注意的东西:

double hmm = 1.0 / 0.0;
double hmm2 = -1.0 / 0.0;
double hmm3 = 0.0 / 0.0;
Console.WriteLine("1/0 == {0}", hmm);
Console.WriteLine("-1/0 == {0}", hmm2);
Console.WriteLine("0/0 == {0}", hmm3);
输出:

1/0 == Infinity
-1/0 == -Infinity
0/0 == NaN
编辑: 关于这个问题:

如果有这样的常量,为什么float.Parse(“a”)抛出错误而不是返回float.NaN

double.NaN
实际上在某种程度上是一个数学定义,它被“定义”为
0.0/0.0
,而“不是一个数字”意味着类似于
double.Parse(“a”)
的东西也应该返回
double.NaN
,它不是。为什么?

我的直觉是,无法确定您收到的
double.NaN
是垃圾数据(在字符串的情况下)还是不确定数字的实际定义,如零除以零。因此,为了区分这两种情况,
double.Parse(“a”)
抛出了一个
异常,我觉得这更准确

如果有这样的常量,为什么
float.Parse(“a”)
抛出错误而不是返回
float.NaN

因为您列出的两个备选方案均不适用于此处:

PositiveInfinity
NegativeInfinity
就是这样–也就是说,它们是
1/0
-1/0
等表达式的结果

NaN
0/0
的结果,也就是说,一个表达式的结果(通常)定义不明确,也不会产生数字

float.Parse(“a”)
不是这样的。诚然,它可能由
NaN
表示,但是您无法区分用户输入的无效
float
值(
a
)和有效的
float
值(
NaN
)。然而,这不是一个非常有力的论点:
NaN
是一个无效数字的占位符,因此可以想象它可以用来表示无效的用户输入


另一方面,还有其他类型具有
Parse
方法,并且不存在
NaN
值(例如
int
)。因此,对于这些类型,
Parse
必须发出错误信号。使不同类型的
解析方法的行为不同是不一致的(因此是糟糕的API设计)。

除了算术结果之外,无穷大值可以用于定义上下文的任何限制

例如:一个父WPF控件要求它的一个子控件在没有大小限制的情况下测量自己;i、 e.有效性是肯定的


Ref:

之所以使用无穷大,是因为它们是浮点支持的算术系统的一部分。有各种各样的运算,例如除以零,其中无穷大是一个有用的结果,在数学上是合理的。显然,没有一个直接的物理量是无限的(例如,你不能有无限多克),但对于物理过程的数学模型或人类用计算机模拟的其他事物的某些方面来说,无限可能是一个有用的值

使用NAN是因为算术系统不完整。也就是说,有些操作的输入值不能用浮点表示正确的数学结果。例如,sqrt(-1)是一个合法的数学运算,但结果(虚数i)不能用浮点表示。因此,NaN用作占位符,表示值超出了浮点数的范围。NaN还可以用于其他目的,例如标记未以其他方式初始化的数据,以帮助调试


float.Parse(“a”)
抛出错误而不是返回NaN,因为它不是合法的操作。此表达式不执行具有超出可表示数字范围的正确结果的数学运算。这是一个实际错误,因此会抛出一个错误。

要解决NAN和无穷大,请使用以下命令:

if (Double.IsNaN(YourValue) || Double.IsInfinity(YourValue))
{
   YourValue = 0;
}

您可以使用TryParse而不是Parse?用于数学运算。@Evgeny:有史以来最模糊的注释。@Liam我的问题不是关于如何解析,我想知道为什么强类型环境中存在NaN。可能与JavaScript的parseFloat(“a”)重复返回NaN。为什么浮点类型可以被零除?@LZW简单回答:因为在过去,您可以键入/编译/运行
1.0/0.0
,这将导致
DivideByZeroException
,但是对于“定义的”
无穷大
NaN
值有理论上的应用——例如,WPF使用这两种方法来表示“未设置”或“未定义”大小等@LZW:在许多情况下,确定是否可以在没有任何中间计算超出范围的情况下对浮点表达式进行求值,将需要比在所有内容都在范围内时对表达式求值所需的计算更昂贵的计算。允许代码尝试对表达式求值,然后找出是否存在问题,这比要求代码提前检测有问题的条件要便宜;它解释了解析失败的原因,因为您基本上是在尝试统一两种没有关系的类型(float和string),这是给出真实世界(而非理论)示例的唯一答案。