Hallo,
Manfred X schrieb:
| Zitat: |  | 1)
"Standardcomparer" war mißverständlich formuliert.
Ich bezog mich auf die Vergleichs-Operatoren
("Standardvergleich")
Genau müßte man schreiben:
Obwohl im Filterstring Vergleichs-Operatoren anzugeben sind,
werden diese beim Filtern nicht benutzt, sondern
datentyp-spezifische
Comparer.
|  |
Ok.
| Zitat: |  | 2)
Ich vermute, der Vergleich mit der Konstante "NaN"
sei anders
(=direkt) implementiert sein, als der Vergleich mit
einer Variable, die diesen Wert enthält (bitweise Gleichheit,
zuvor Fallunterscheidungen):
'Vergleich mit Konstante
Dim v1 As Integer = Double.NaN.Equals(Double.NaN)
'Vergleich mit Variable
Dim dbl As Double = Double.NaN
Dim v2 As Integer = dbl.Equals(Double.NaN) |  |
Dass der Vergleich mit einer Konstanten anders implementiert ist, als der Vergleich mit einer Variable mit diesem Wert, kann eigentlich nicht sein, denn beim Aufruf von Methoden wie Equals() weiß die Double-Instanz ja nicht, ob sie eine Konstante oder ein Wert aus einer Variablen ist. Beim Vergleich mit den Operatoren zählt nur der Wert, der sich aus dem Audruck ergibt, d.h. es macht keinen Unterschied, ob der Wert aus einer Konstanten, aus einer Variable, einem Ausdruck usw. kommt (Ausnahme bilden Codeoptimierungen, die ein Compiler durchführen kann).
Aus dem Quellcode der Double.Equals-Methode kann man sehen, dass dieser zuerst einen Vergleich mit dem =-Operator durchführt und bei False dann noch Double.IsNaN mit beiden Operanden prüft.
Wie meinst du das mit bitweiser Gleichheit? Beim Vergleich von zwei Double-Werten führen der =-Operator und die Equals-Methode ja nicht unbedingt einen bitweisen Vergleich durch, z.B. kommt bei den Double-Werten 0.0 und -0.0 Gleichheit heraus, obwohl diese nicht bitgleich sind:
static unsafe void Main(string[] args) {
double a = 0.0, b = 0.0, c = -0.0;
Console.WriteLine((a == b) + ", " + a.Equals(b)); // "True, True"
Console.WriteLine((a == c) + ", " + a.Equals(c)); // "True, True"
Console.WriteLine(CompareBytes(&a, &b, sizeof(double))); // "True"
Console.WriteLine(CompareBytes(&a, &c, sizeof(double))); // "False"
Console.ReadKey();
}
static unsafe bool CompareBytes(void* a, void* b, int size) {
for (int i = 0; i < size; i++)
if (*((byte*)a + i) != *((byte*)b + i))
return false;
return true;
} |