Was ist der schnellste Weg zu erkennen, ob ein double
Wert ein endlicher Wert (weder NaN noch positive/negative Unendlichkeit) in IL ist, ohne eine Ausnahme zu werfen?Der schnellste Weg zu erkennen, ob ein Double endlich ist?
ich erwäge die folgenden Ansätze (C# Notation für die Bequemlichkeit des Lesers nur, in meinem Projekt verwende ich IL für diese):
!double.IsNaN(x) && !double.IsInfinity(x)
- das offensichtlichste und wahrscheinlich die langsamste weil 2 Methodenaufrufe sind beteiligt.(*(((long*) &x)) & 0x7fffffffffffffffL) < 0x7ff0000000000000L
oder in IL:
ldloca x
conv.u
ldind.i8
ldc.i8 0x7fffffffffffffff
and
ldc.i8 0x7ff0000000000000
clt
Meine Fragen über den zweiten Ansatz sind:
Nach meinen Recherchen, sollte diese genau bestimmen, ob eine gegeben
x
ist endlich. Ist das wahr?Ist es der bestmögliche Weg (Performance-weise), um die Aufgabe in IL zu lösen, oder gibt es eine bessere (schnellere) Lösung?
P.S. Ich schätze Empfehlungen, meine eigenen Benchmarks zu betreiben und herauszufinden, und werde dies sicherlich tun. Dachte nur, vielleicht hat jemand schon ähnliches Problem und kennt die Antwort. P.P.S. Ja, ich merke, dass wir hier abot ns sprechen, und ja, sie sind wichtig für meinen speziellen Fall
Put '' (* (((long *) & x)) & 0x7fffffffffffffffL) <0x7ff0000000000000L'' in einer '' inline''d Funktion und b Ich bin glücklich. –
@BinkanSalaryman ja, er könnte, aber wenn der OP nicht der einzige ist, der den Code verwaltet, muss er einen * sehr, sehr, sehr * guten Kommentar schreiben ... –
Ja, tatsächlich. Wenn es nicht erforderlich ist, halten Sie sich einfach an die angegebenen .NET-Framework-Methoden. –