Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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/3/sql-server-2005/2.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# 为什么';t将数字添加到Double.MaxValue会使其成为Double.PositiveInfinity吗?_C# - Fatal编程技术网

C# 为什么';t将数字添加到Double.MaxValue会使其成为Double.PositiveInfinity吗?

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 为什么会这

文件中写道:

当操作结果大于MaxValue时,返回此常量

但是,当我尝试向最大值
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
    的精度。