Wie kann man in Ruby von 0,0001 bis 1 zählen?

7

Ich möchte von 0,0001 bis 1 mit 0,0001 Schritten in Ruby zählen. Ich habe diesen Code geschrieben, aber es kommt in eine Endlosschleife. Manchmal führt der Dolmetscher eine falsche Summe aus.

%Vor%

Hier ist der erste 10 Wert, den es gibt:

%Vor%

Es sollte 0,0001, 0,0002, 0,0003, etc ... sein Wie kann ich es zum Laufen bringen? Danke!

    
Hiddin 16.12.2011, 14:32
quelle

6 Antworten

2

Das Problem ist, dass reelle Zahlen in Ruby nicht genau durch binäre Speicherung und Manipulation dargestellt werden. Ich würde das tun

%Vor%     
ghoppe 16.12.2011, 14:38
quelle
16

Versuchen Sie Folgendes:

%Vor%

BEARBEITEN : Sie sollten die Float#step -Methode verwenden, da sie Sie vor der Seltsamkeit der Fließkomma-Arithmetik schützt. Float#step sorgt dafür, dass der Wert inkrementiert und mit dem Limit verglichen wird. Weitere Informationen finden Sie in der offiziellen Dokumentation von Float#step .

    
gioele 16.12.2011 14:37
quelle
1

Fügen Sie x != 1.0 anstelle von x < 1.0 ein. Das wird zumindest sicher sein, dass deine Schleife endet.

Ein binäres System wie das, das alle unsere modernen Computer ausführt, kann (einfach) Brüche nicht darstellen, besonders solche, die nicht genau im Dezimalsystem dargestellt werden können. Hier kommt die seltsame Zahl, wenn du .0003 haben solltest. Es ist ein Artefakt, wie die Zahlen intern dargestellt werden.

Einige Sprachen sind besser im Umgang mit Zahlen und Genauigkeit als andere. Wenn also die Genauigkeit der Zahlen zählt, müssen Sie entweder eine andere Sprache verwenden, eine Bibliothek verwenden, die die Anzahl der Dinge für Sie verarbeitet (signifikante Ziffern und all das) ), oder Sie müssen bei jedem Schritt selbst mit entsprechenden Rundungen etc. umgehen.

    
cdeszaq 16.12.2011 14:34
quelle
0

Fließkommazahlen sind nicht genau Wikipedia Floating Point-Artikel .

Wenn Sie cleane xs haben müssen, würde ich empfehlen, eine Ganzzahl zu verwenden und sie vor der Verwendung des Werts durch 1000 zu dividieren. Wenn Sie sich nicht um die kleinen Störgeräusche kümmern, können Sie Ihre while x! = 1.0 zu while ändern, während x & lt; 1.0

    
Tom Cerul 16.12.2011 14:39
quelle
0

Was Sie sehen, hängt mit der binären Darstellung von Fließkommazahlen zusammen. Dies betrifft alle Computerprogrammiersprachen. Für weitere Einzelheiten siehe Was jeder Informatiker über Gleitkommaarithmetik wissen sollte .

Sie können es zum Druckzeitpunkt auf die entsprechende Anzahl von Stellen runden oder, wie goiele gefunden hat, verwenden Sie step :

%Vor%     
Mark Thomas 16.12.2011 14:48
quelle
0
%Vor%     
maprihoda 16.12.2011 15:06
quelle