2015-06-29 11 views
18

Angenommen a, b, c und d sind double erklärt (oder float). Sind die folgenden Ausdrücke immer wahr?Sind Schwimmer Ungleichheiten garantiert konsistent sein

! ((a >= b) && (c <= d)) || ((a-c) >= (b-d)) 

! ((a > b) && (c <= d)) || ((a-c) > (b-d)) 

! ((a >= b) && (c < d)) || ((a-c) > (b-d)) 

Gibt es eine Garantie von dem IEEE 754 oder der aktuellen C oder Standard C++? Und wird jeder Compiler das zum Zeitpunkt der Kompilierung einfach als wahr optimieren? Ich interessiere mich hauptsächlich für normale Werte, nicht so sehr für subnormale oder spezielle Werte.

Scheint mir, dass dies hauptsächlich auf Abrundungsfehler während der Subtraktion abhängen sollte.

+0

"wird jeder Compiler das zur Kompilierungszeit als einfach wahr optimieren" - warum versuchst du es nicht? –

+2

@ 101010 "wenn' a! = B' ihre darstellenden Bits sind auch anders "- falsch. (+0 und -0, NaN, etc.) –

+0

Kann der Compiler die Werte von a, b, c und d zur Kompilierzeit kennen? –

Antwort

10

Für die 3. falsch zu produzieren es ausreichend sein sollte groß gleich a und b und kleine ungleiche c und d, zum Beispiel zu nehmen a=1e30, b=1e30, c=1e-31, d=1e-30.

EDIT: Ok, für die zweite falsch zu erzeugen, in Analogie zu der 3., sollte es ausreichend sein, klein zu nehmen ungleich a und b Großen und Ganzen gleich c und d, z.B. a=1e-30, b=1e-31, c=1e30, d = 1e30.

keine Ahnung von einem Gegenbeispiel für den ersten Ausdruck ...

+1

Richtig, nur die Nummer eins steht. –

+0

Ich vermute, dass es nicht möglich ist, Werte zu wählen, die # 1 falsch machen. –

+4

Die Einstellung von abc und d auf + Infinity ergibt false für # 1 [demo] (http://ideone.com/oXmPXP), obwohl ich denke, dass das nicht zählt, weil es ein "spezieller" Wert ist – samgak

7

Serge Rogatch gab Gegenbeispiele zu Ihrem zweiten und dritten Ausdrücke.

Die erste, !(a >= b && c <= d) || a-c >= b-d, ist in IEEE 754-Arithmetik immer wahr, wenn a, b, c und d alle endlich sein muss. Subtraktion von endlichen Zahlen kann keine NaN erzeugen. Ein Gegenbeispiel muss also a >= b && c <= d && a-c < b-d erfüllen. Jedoch bedeutet a >= b, dass a-c >= b-c, was auch immer c ist, und c <= d bedeutet, dass b-c >= b-d, was auch immer b ist. Die Transitivität von >= kümmert sich um den Rest.

Sie können a = c = 1.0/0.0 nehmen und willkürliche Auswahl von b und d für ein Gegenbeispiel nehmen, wenn Sie den Zustand entspannen, dass a, b, c und d alle endlich sein muss. Alle Gegenbeispiele haben im wesentlichen diese Form.

+0

"Allerdings bedeutet a> = b, dass a-c> = b-c, was immer c ist, und c <= d impliziert, dass b-c> = b-d, was auch immer b ist." - Wie können wir sicher sein, dass diese Annahme wahr ist? –

+0

@temple: Wenn a und b endlich sind, kann c -oo, endlich oder oo sein. Wenn c -oo ist, dann a - c == oo und b - c = oo. Wenn c oo ist, dann a - c = -oo und b - c = -oo. Wenn c endlich ist, dann ist vor dem Runden a-c> = b-c. Rundung bewahrt> =. – tmyklebu

Verwandte Themen