2010-12-13 4 views
1

Ich fragte mich, wie ich die beste Präzision auf Rubin bekommen kann. Jemand sagte mir, dass die beste Genauigkeit wahrscheinlich zwischen 0 und 1 liegt, denn wenn Sie in größere Zahlen gehen, erhöht sich auch der Schritt.was ist die beste numerische Präzision in Rubin

Ich denke, ein Weg, um herauszufinden, was die Mindest-Float-Nummer ist und was die nächste Float-Nummer, dann wäre die Genauigkeit der Unterschied, nicht wahr? Wenn ich richtig liege, wie könnte ich das auf Ruby machen?

Ich bin mir nicht sicher, wie man diese http://ruby.wikia.com/wiki/Float verwendet, um diese Informationen zu finden.

Jede Hilfe wird geschätzt.

Antwort

3

In Bezug auf signifikante Ziffern ist die Genauigkeit unabhängig vom Maßstab gleich. Das heißt, wenn Sie Ihren Bereich von [0.0, 1000.0] auf [0.0, 1.0] skalieren, indem Sie Zahlen im natürlichen Bereich durch 1000.0 dividieren, hat dies keinen erkennbaren Effekt auf die Genauigkeit Ihrer Reichweite. In der Tat wird ein größerer Bereich eine geringfügig größere Genauigkeit haben, da er den kleineren Bereich vollständig enthält.

wie für die absolute Präzision der Entdeckung, gibt es zwei Probleme:

  1. Die absolute Genauigkeit von der Größe abhängt, die "unendlich" im Bereich [0, 1] (lim x → variiert 0 log (x) = - ∞). Es gibt also keine Genauigkeit für Zahlen in diesem Bereich. Sie können nur absolute Genauigkeit an einem bestimmten Punkt im Bereich ableiten.
  2. Die übliche Methode zum Auffinden des minimalen Schritts - ulp genannt - besteht darin, die Bitdarstellung des Floats als Ganzzahl zu interpretieren, um eins zu erhöhen und das Ergebnis als Gleitkommazahl neu zu interpretieren. Ruby macht das nicht, AFAIK.

Es gibt jedoch eine iterative Lösung. Addieren Sie einfach 1,0 zur Zahl und subtrahieren Sie ((x + 1.0) - x). Wenn die Differenz Null ist, verdoppeln Sie den Summanden ((x + 2.0) - x) und wiederholen Sie den Vorgang, bis die Differenz nicht Null ist. Andernfalls den Addend halbieren (auf 0,5) und wiederholen, bis die Differenz Null ist. Wann immer Sie aufhören, ist der niedrigste Summand, der eine Differenz ungleich null erzeugt, der ulp. (I beschrieben dies aus vage Erinnerung, so könnte es NQR sein.)

1

können Sie Klasse verwenden Rational - es speichert nicht-Integer-Zahlen als Fraktion von zwei Integer s, die (soweit ich weiß) werden automatisch konvertiert bis Bignum, wenn nötig.

1

Die Ruby-Bibliothek Flt bietet eine beliebige Fließkomma-Genauigkeit.

Verwandte Themen