2010-09-03 5 views
7

Stellen Sie sich vor, a - b < c (a, b, c sind C# double). Ist es garantiert, dass ein < b + c?C# double precision problem

Danke!

EDIT
Lassen Sie sich sagen, daß der arithmetische Überlauf nicht auftritt, im Gegensatz zu dem folgende Beispiel:

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

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

Stellen Sie sich vor, dass Math.Abs ​​(a) < 1,0 & & Math.Abs ​​(b) < 1,0 & & Math.Abs ​​(c) < 1,0

+0

Wie hängt das mit C# oder einem zusammen? y spezifischer Datentyp (oder sogar Programmierung)? Sieht für mich wie reine Mathematik aus. –

+2

@Fredrik Mörk: Nein, es geht nur um Präzision. – jgauffin

+1

@Fredrik Mörk: Weil es mit den Sprachen Genauigkeit der nicht-ganzzahligen Arithmetik – BeRecursive

Antwort

14

No. Angenommen a = c, eine sehr große Zahl, und b ist eine sehr kleine Zahl. Es ist möglich, dass a - b eine Darstellung weniger als a hat, aber a + b ist so nah an a (und größer), dass es am Ende noch am genauesten als a darstellbar ist.

Hier ist ein Beispiel:

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

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

EDIT:

Hier ist ein weiteres Beispiel, das Ihre editierten Frage passt:

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 

Mit anderen Worten, wenn wir eine sehr kleine Zahl subtrahieren 1, erhalten wir ein Ergebnis kleiner als 1. Wenn wir die gleiche Zahl zu 1 hinzufügen, erhalten wir nur 1 zurück aufgrund der Einschränkungen der doppelten Genauigkeit.

+0

+1, Beweis durch ein Gegenbeispiel. Liebe es. –

+0

oder umgekehrt, ich habe auch das Gefühl, dass es so ist. –

+2

Es wird noch seltsamer, wenn 'a = c = double.MaxValue'. Dann sind beide falsch. –

6

nein, nicht immer:

 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

Dieser Link spricht über Gleitkommaarithmetik Eigenschaften und könnte sehr interessant:

FLOATING-POINT FALLACIES

Insbesondere Suche nach Eigenschaften von Beziehungen