next up previous contents index
Search Next: Rechenoperatoren Up: Ruby als Zahlenjongleur Previous: Ruby als Zahlenjongleur   Contents   Index


Ganze und Fließkommazahlen

In Ruby sind alle Zahlen vollwertige Objekte, die aus einer der Klassen[*] Fixnum, Bignum oder Float stammen.

Ruby legt für ganze Zahlen keine Obergrenze fest und wechselt bei Bedarf automatisch zwischen platzsparenden Fixnum-Zahlen und beliebig großen Bignum-Zahlen hin und her, wann immer die "`magische Grenze"' \(2^{30} - 1=1073741823\) überschritten wird (siehe State-Pattern [GOF94]).

meineZahl = 2**30     #-> 1073741824
meineZahl.class       #-> Bignum
meineZahl -= 1        #-> 1073741823
meineZahl.class       #-> Fixnum

Dabei werden Bignum-Zahlen mit allen Ziffern gespeichert, so dass keine Rundungsverluste auftreten. Bei den Appetithappen (Kapitel 1.2) haben wir mit der Fakultät von 100 schon ein Beispiel gesehen.

Um die Zahlen bei der Eingabe lesbarer zu machen, kann man die Ziffern mit _ gruppieren.

342_599_001 == 342599001 #-> true

Jede Fließkommazahl ist eine Instanz[*]der Klasse "`Float"'. Eine konstante Fließkommazahl muss einen Dezimalpunkt enthalten, die übliche E-Notation zur Angabe von Zehnerpotenzen steht ebenfalls zur Verfügung.

Float.new(3)         #-> 3.0
3.141.class          #-> Float
3.4567e3 == 3456.7   #-> true

Ein "`Float"' [*]in Ruby entspricht einem "`double"' in C in der jeweils verwendeten Rechnerarchitektur. Das bedeutet, dass Fließkommaberechnungen auf unterschiedlichen Plattformen unterschiedliche Ergebnisse haben können!

Bei Bedarf können Zahlen mit der Methode to_s in eine Zeichenkette umgewandelt werden:

1.to_s      #-> "1"
1.3.to_s    #-> "1.3"

Ruby unterstützt auch die Optionen zur formatierten Ausgabe, wie sie in C, Perl und Python vorhanden sind:

printf "Nr. %4d: %.2f", 1, 1.355
  #-> Nr.    1: 1.35
"Nr. %4d: %.2f" % [2, 1.345]
  #-> "Nr.    2: 1.34"


\epsfig{height=36pt,file=images/chan.eps}Benötigt man höhere Genauigkeiten, steht im Ruby Application Archive [RAA] die Klasse BigFloat von Shigeo Kobayashi zur Verfügung. Für numerische Anwendungen, die Zahlen in Arrays speichern müssen, gibt es an der gleichen Stelle das NArray-Paket. Damit werden Ganzzahl- und Fließkommarechnungen fast so schnell wie in C. \epsfig{height=10pt,file=images/ruby.eps}

Arithmetik sieht in Ruby genauso aus wie in anderen Programmiersprachen, da Ruby die üblichen Vorrangregeln befolgt: Klammer vor Hoch vor Punkt vor Strich. Allerdings gibt es neben dieser bekannten Schreibweise noch eine zweite, die den Objektcharakter von Zahlen in Ruby betont:

3 + 5.7        #-> 8.7
3.+(5.7)       #-> 8.7
Im ersten Beispiel werden 3 und 5.7 addiert, während in der zweiten Zeile der Fixnum-Instanz 3 die Methode[*]+ mit dem Paramter 5.7 übermittelt wird. Für das Objekt 3 besteht die Implementation der Methode + darin, die Summe aus der angesprochenen Zahl und dem übergebenen Argument zu bilden.



Footnotes

... Klassen[*]
Klasse = Fabrik
... Instanz[*]
Instanz = Produkt einer Klasse
... "`Float"'[*]
Fließkommarechnungen sind plattformabhängig
... Methode[*]
Methode=Botschaft

next up previous contents index
Search Next: Rechenoperatoren Up: Ruby als Zahlenjongleur Previous: Ruby als Zahlenjongleur   Contents   Index
(C) 2002 by dpunkt.de, Armin Roehrl, Stefan Schmiedl, Clemens Wyss 2002-01-20