2012-04-10 6 views
1

Ich dachte, dass der Zweck von Rubys BigDecimal-Klasse ist, dass es unendlich beliebig präzise auf Kosten der Geschwindigkeit ist. Falsch:Quadratwurzel in Ruby mit mehr Genauigkeit als BigDecimal.sqrt?

> BigDecimal(4).sqrt(4) 
=> #<BigDecimal:906602c,'0.1999999999 9999999998 66602351E1',36(36)> 
> BigDecimal(4).sqrt(11) 
=> #<BigDecimal:9e36850,'0.2E1',9(45)> 

Zuerst sqrt sollte ohne Parameter arbeiten, zumindest von der Dokumentation. Zweitens, wenn dieser Parameter die Genauigkeit ist, sollte 4 für diese Operation ausreichen (oder zumindest sollte ich nicht wissen, dass die 11-stellige Genauigkeit in Ordnung ist).

Das Letzte, was ich will, ist das Rad neu zu erfinden und eine eigene 'beliebig genaue Quadrierungsbibliothek' zu erstellen.

Fragen:

  • Ist es möglich, Parameter zu einer BigDecimal-Instanz festgelegt, so dass die oben nicht geschieht? (Bedeutung: Es gibt ein korrektes Ergebnis bei niedriger Genauigkeit zurück)
  • Gibt es detaillierte Informationen zum BigDecimal-Objekt (was sind diese Zahlen nach dem Wert)?

System: Debian, 32-bit, Rubin 1.9.3p125

+0

Was ist deine Frage noch einmal? (Ich verstehe das Problem, dass Sie diese Frage grundsätzlich verwenden, um sich zu beschweren, aber ich bin nicht sicher, welche Hilfe Sie von Stack Overflow suchen.) Nur _ "wo sind [die Dokumente auf BigDecimal] (http: // rubi-doc.org/stdlib-1.9.3/libdoc/bigdecimal/rdoc/BigDecimal.html)"_? – Phrogz

+0

Um "unendlich präzise" sqrt zu machen, braucht man unendlich viel Speicher. Ich nehme an, du hast es nicht. Was ist dann falsch? –

+0

@VictorMoroz Ich habe viel Speicher, aber zu meiner Bestürzung konnte ich nicht alles testen, als ich auf dieses Problem stoße, dass die Quadratwurzel von 4 nicht 2 ist, in einer beliebig genauen Bibliothek. – karatedog

Antwort

1

Der große Dezimal-docs für inspect beschreiben, was das Ausgabemittel.

In Bezug auf die Dokumentation für sqrt, die eine Dokumentation Bug zu sein scheint - http://bugs.ruby-lang.org/issues/5267

Wie für die Ausgabe sehen Sie bekommen, ich bin nicht sicher - ich 0.2E1 in beiden Fällen erhalten.

+0

In _arbitrary precision_ was bedeutet die * maximale Genauigkeit * im Falle einer sich wiederholenden, nicht terminierenden Zahl wie 1.0/3.0? Ich dachte, dass _precision_ etwas von mir ist, da willkürliche Präzision keine harten Grenzen vorgeben sollte. – karatedog

+0

willkürlich ist nicht das Gleiche wie unendlich. Sie können nach einer beliebigen Genauigkeit fragen (10 signifikante Ziffern, 100 usw.), aber Sie müssen die Zeit vorher wählen –

+0

Das ist genau das, was ich geschrieben habe: "* Genauigkeit ist etwas, das von mir gesetzt wird *". BigDecimal scheint jedoch einen gewissen Präzisionswert zu wählen. – karatedog

Verwandte Themen