想象一下 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
答案 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)