C# 为什么';t将数字添加到Double.MaxValue会使其成为Double.PositiveInfinity吗?
文件中写道: 当操作结果大于MaxValue时,返回此常量 但是,当我尝试向最大值C# 为什么';t将数字添加到Double.MaxValue会使其成为Double.PositiveInfinity吗?,c#,C#,文件中写道: 当操作结果大于MaxValue时,返回此常量 但是,当我尝试向最大值double添加一个数字时,它不会返回无穷大。我试过运行这个: double maxVal = Double.MaxValue; maxVal = maxVal + 10000000000000000000; Console.WriteLine(maxVal + " " + Double.IsInfinity(maxVal)); //prints 1.79769313486232E+308 False 为什么会这
double
添加一个数字时,它不会返回无穷大。我试过运行这个:
double maxVal = Double.MaxValue;
maxVal = maxVal + 10000000000000000000;
Console.WriteLine(maxVal + " " + Double.IsInfinity(maxVal)); //prints 1.79769313486232E+308 False
为什么会这样?为什么它不将maxVal
显示为infinity
这是因为您要添加的数字太小,无法在Double.MaxValue
值上留下凹痕
double
的精度约为15位,因此您需要一个至少为1e292
的数字,才能使其足够大以产生差异
这将是10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
根据定义,当
(*(长*)(&d)和0x7FFFFFFFFFFFFFFFFF)==0x7FF00000000代码>
当您在示例中替换它时,您将看到转换后,double.MaxValue
哪个值是1.7976931348623157E+308
+100000000000000000
仍然比0x7FF0000000000000
最小
- 为什么它返回
double.MaxValue
,因为根据数学定义,X+z=X
表示X的最大值和z的最小值
值100000000000000000
只是为了产生任何差异而变小。但为什么它不会溢出?你一直在向double添加数字,它保持在double.MaxValue?我刚刚在一个循环中将80000000000000000
添加到MaxValue
100000次,在您添加8E+23之后,它仍然是MaxValue
@milies。这大约是MaxValue点后的第285个符号。然而,尾数的长度只有15个符号。加上8E+23实际上并没有改变数字。@AndreySarafanov是的,但我不明白他们为什么这样做。我刚刚做了max+=1e292
,现在Double.IsInfinity
返回true。它不适用于1e291
。我希望行为的定义会有所不同。这是一个很好的答案@miliesmith在将80000000000000000添加到maxVal、Console.WriteLine(maxVal==double.MaxValue)后尝试以下操作;请注意,maxVal==Double.MaxValue返回true,这是因为Double的算术工作方式@TimSchmelter:double.MaxValue+1
的结果实际上是double.MaxValue
。计算机在添加数字时不能使用无限精度,因此当将1
放入与double.MaxValue
相同的范围时,它将消失。另一个例子是1+1e-20
,结果是1
。如果您试图将1.00000000000001
表示为double
,您将得到1
,因为最后一个小数点超出了double
的精度。