有什么好处NaN,PositiveInfinity或者NegativeInfinity用于float和double?我们何时应该使用或避免它们?
如果有这样的常量,为什么float.Parse("a")抛出错误而不是返回float.NaN?
怎么NaN不同null?为什么division by zero浮动类型甚至可能?
使用无穷大是因为它们是浮点支持的算术系统的一部分.存在各种操作,例如除以零,其中无穷大是有用的结果并且在数学上是合理的.显然,没有直接的物理量可以是无限的(例如,你不能拥有无限多的克),但无穷大可能是物理过程的数学模型或人类用计算机建模的其他事物的某些方面的有用价值.
使用NaN是因为算术系统不完整.也就是说,存在具有输入值的操作,其中适当的数学结果在浮点内不可表示.例如,sqrt(-1)是一个合法的数学运算,但结果,即虚数i,在浮点数中不可表示.因此,NaN用作占位符以指示值已超出浮点数.NaN还可以用于其他目的,例如标记未以其他方式初始化的数据,以帮助调试.
float.Parse("a")抛出错误而不是返回NaN,因为它不是合法的操作.此表达式不执行在可表示数字之外具有适当结果的数学运算.这是一个实际错误,因此会引发错误.
它们不是你使用的东西,因为它们是你需要注意的东西:
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);
Run Code Online (Sandbox Code Playgroud)
输出:
1/0 == Infinity
-1/0 == -Infinity
0/0 == NaN
Run Code Online (Sandbox Code Playgroud)
编辑:至于这个问题:
如果有这样的常量,为什么float.Parse("a")抛出错误而不是返回float.NaN?
double.NaN实际上是一种数学定义 - 它被"定义"为0.0/0.0- 虽然"不是数字"这个词意味着类似的东西也double.Parse("a")应该返回double.NaN,但事实并非如此.为什么?
我的预感是因为无法确定double.NaN你收到的是垃圾数据的结果(在字符串的情况下)还是不确定数字的实际定义,如零除以零.所以,为了区分这两种情况,double.Parse("a")抛出一个Exception,我觉得更准确.
如果有这样的常量,为什么
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 必须发出错误信号.使不同类型的Parse方法表现不同会是不一致的(因此API设计不好).
| 归档时间: |
|
| 查看次数: |
8336 次 |
| 最近记录: |