2009-04-15 8 views
3

Warum double.Epsilon != std::numeric_limits<double>::min()?double.Epsilon gegen std :: numeric_limits <double> :: min()

Auf meinem PC: double.Epsilon == 4.9406564584124654E-324 und in .NET definiert ist std::numeric_limits<double>::min() == 2.2250738585072014e-308

Gibt es eine Möglichkeit 2.2250738585072014e-308 von .NET zu erhalten?

Antwort

9

Sie sind anders, weil double.Epsilon die kleinste darstellbare Wert zurückgibt. numeric_limits<double>::min() gibt den kleinsten normalisierten Wert zurück.

Grundsätzlich double.Epsilon ist das Äquivalent zu numeric_limits<double>::denorm_min().

Der einfachste Weg, das Äquivalent in .NET zu erhalten, ist wahrscheinlich, das Bitmuster für die minimale normalisierte Zahl zu berechnen und BitConverter.Int64BitsToDouble zu verwenden.

+0

Genau die Art von Antwort, die ich suchte. Danke Jon – sthiers

1

Nun könnten Sie C++ verwenden/CLI den Wert zurück:

double epsilon() { return std::numeric_limits<double>::min(); } 

Warum würden Sie wollen, obwohl zu? Warum müssen sie gleich sein? Sie sollten versuchen, Skaten an den Kanten Ihrer Gleitkommazahlen zu vermeiden.

-2

Epsilon ist der minimal mögliche Unterschied zwischen zwei Doppel. (Edit: nicht exakt, es ist die minimale positive Zahl ungleich Null in diesem Fall).

double.MinValue 

ist, was Sie brauchen.

+1

Das OP sucht nach einer kleinen, aber positiven Zahl. double.MinValue ist eine massive und negative Zahl. –

+0

Uh? Ich dachte, tnan numeric_limits gibt minimalen Wert zurück, der dargestellt werden kann, nicht minimal von Null. – nothrow

+0

Schauen Sie sich die Werte in der Frage an: "std :: numeric_limits :: min() == 2.2250738585072014e-308" –