C#双精度问题

时间:2010-09-03 09:16:26

标签: c# double precision

想象一下 a - b< c (a,b,c是C#双打)。是否保证 a< 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

想象一下 Math.Abs​​(a)&lt; 1.0&amp;&amp; Math.Abs​​(b)&lt; 1.0&amp;&amp; Math.Abs​​(c)&lt; 1.0

3 个答案:

答案 0 :(得分:14)

没有。假设a = c,一个非常大的数字,b是一个非常小的数字。 a - b的表示可能小于a,但a + b非常接近a(并且更大),因此它最终可以最精确地表示为{a 1}}。

以下是一个例子:

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

Console.WriteLine(a - b < c); // Prints True
Console.WriteLine(a < b + c); // Prints False

编辑:

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

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

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

答案 1 :(得分: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

答案 2 :(得分:2)

这个链接讲的是浮点算术属性,可能非常有趣:

FLOATING-POINT FALLACIES

特别是,搜索 关系属性