C#双精度问题

lev*_*ovd 7 c# precision double

想象一下a - b <c(a,b,c是C#的双打).是否保证<b + c

谢谢!

编辑
假设与以下示例不同,算术溢出不会发生:

double a = 1L << 53;
double b = 1;
double c = a;

Console.WriteLine(a - b < c); // Prints True
Console.WriteLine(a < b + c); // Prints False
Run Code Online (Sandbox Code Playgroud)

想象一下,Math.Abs​​(a)<1.0 && Math.Abs​​(b)<1.0 && Math.Abs​​(c)<1.0

Jon*_*eet 14

不.假设a = c,非常大的数字,b是非常小的数字.它的a - b表示可能小于a,但是a + b如此接近a(并且更大),它仍然最终可以最精确地表示为a.

这是一个例子:

double a = 1L << 53;
double b = 1;
double c = a;

Console.WriteLine(a - b < c); // Prints True
Console.WriteLine(a < b + c); // Prints False
Run Code Online (Sandbox Code Playgroud)

编辑:

这是另一个与您编辑过的问题相符的示例:

double a = 1.0;
double b = 1.0 / (1L << 53);
double c = a;

Console.WriteLine(a - b < c); // Prints True
Console.WriteLine(a < b + c); // Prints False
Run Code Online (Sandbox Code Playgroud)

换句话说,当我们从1中减去一个非常小的数字时,我们得到的结果小于1.当我们将相同的数字加到1时,由于双精度的限制,我们只得到1.

  • 当`a = c = double.MaxValue`时,它甚至变得怪异.然后两者都是假的. (2认同)

Tim*_*ter 6

不总是:

        double a = double.MaxValue;
        double b = double.MaxValue;
        double c = 0.1;
        Console.WriteLine(a - b < c); // True
        Console.WriteLine(a < b + c); // False
Run Code Online (Sandbox Code Playgroud)