当我运行以下代码时,两行都会打印出0:
如果操作结果超出范围,我希望能够得到Double.NaN。但实际上得到了0。似乎要检查以下内容才能检测到这种情况:
- 在操作之前,检查任何一个操作数是否为零。 - 在操作之后,如果两个操作数都不为零,则检查结果是否为零。如果不是,则让它运行。如果为零,则将Double.NaN分配给它,以表明它不是真正的零,而是无法在此变量中表示的结果。
这样做相当繁琐。有更好的方法吗?Double.NaN是用于什么的?我认为某些操作必须返回它,设计者肯定不是为了万一才放置它的。这可能是BCL中的一个错误吗?(我知道这不太可能,但这就是为什么我想了解Double.NaN应该如何工作的原因)
更新:
顺便说一下,这个问题不仅针对double,decimal也同样存在。
Double a = 9.88131291682493E-324;
Double b = a*0.1D;
Console.WriteLine(b);
Console.WriteLine(BitConverter.DoubleToInt64Bits(b));
如果操作结果超出范围,我希望能够得到Double.NaN。但实际上得到了0。似乎要检查以下内容才能检测到这种情况:
- 在操作之前,检查任何一个操作数是否为零。 - 在操作之后,如果两个操作数都不为零,则检查结果是否为零。如果不是,则让它运行。如果为零,则将Double.NaN分配给它,以表明它不是真正的零,而是无法在此变量中表示的结果。
这样做相当繁琐。有更好的方法吗?Double.NaN是用于什么的?我认为某些操作必须返回它,设计者肯定不是为了万一才放置它的。这可能是BCL中的一个错误吗?(我知道这不太可能,但这就是为什么我想了解Double.NaN应该如何工作的原因)
更新:
顺便说一下,这个问题不仅针对double,decimal也同样存在。
Decimal a = 0.0000000000000000000000000001m;
Decimal b = a* 0.1m;
Console.WriteLine(b);
这也会得到零。
在我的情况下,我需要双精度浮点数,因为我需要它们提供的范围(我正在进行概率计算),而且我并不太担心精度问题。
然而,我需要能够检测到我的结果何时停止有意义,也就是当计算将值降低到无法用双精度浮点数表示时。
有没有实用的方法来检测这个问题?
Decimal
或等效整数类型。 - Adam Houldsworth0
,可以将其视为始终是错误值。不存在概率为0
(也不存在概率为1
),这根本就没有意义。如果出现了0
或1
,那么你已经失败了。 - Luaan