Die Programmiersprache Ruby (German Edition)
Wenn mindestens einer der Operanden ein Float ist, wird eine Fließkommadivision durchgeführt:
x = 5/2 # Ergebnis ist 2
y = 5.0/2 # Ergebnis ist 2.5
z = 5/2.0 # Ergebnis ist 2.5
Die ganzzahlige Division durch null sorgt dafür, dass ein
ZeroDivisionError
ausgelöst wird. Fließkommadivision durch null erzeugt keinen Fehler; sie liefert einfach den Wert
Infinity
zurück. Der Fall
0.0/0.0
ist eine Besonderheit; auf der meisten modernen Hardware mit den meisten Betriebssystemen ergibt sich ein anderer spezieller Fließkommawert namens NaN oder Not-a-Number (zu Deutsch »keine Zahl«).
Der Modulo-Operator (
%
) berechnet den Rest der ganzzahligen Division:
x = 5%2 # Ergebnis ist 1
Der
%
-Operator kann auch mit
Float
-Operanden verwendet werden, was aber seltener vorkommt:
x = 1.5%0.4 # Ergebnis ist 0.3
----
Division, Modulo und negative Zahlen
Wenn einer der Operanden negativ ist (aber nicht beide), führt Ruby die Integer-Divisions- und Modulo-Operationen anders durch als Sprachen wie C, C++ und Java (aber genauso wie die Sprachen Python und Tcl). Betrachten Sie den Quotienten
−7/3
. Das Fließkommaergebnis ist
−2.33
. Das Ergebnis einer ganzzahligen Division muss jedoch ein Integer sein, so dass diese Zahl gerundet werden muss. Ruby rundet Richtung minus unendlich und gibt
−3
zurück. C und verwandte Sprachen runden Richtung null und geben
−2
zurück. (Das ist lediglich eine Interpretationsweise der Ergebnisse; in Wirklichkeit findet natürlich keine Fließkommadivision statt.)
Eine wichtige Folge aus der Ruby-Definition einer Integer-Division ist, dass
-a/b
in Ruby gleich
a/-b
ist, aber möglicherweise nicht gleich
-(a/b)
.
Auch die Ruby-Definition der Modulo-Operation unterscheidet sich von derjenigen in C und Java. In Ruby hat
−7%3
das Ergebnis
2
. In C und Java lautet das Ergebnis dagegen
−1
. Die Größe des Ergebnisses ist natürlich anders, weil der Wert des Quotienten ein anderer ist. Aber auch das Vorzeichen des Ergebnisses ist anders. In Ruby entspricht das Vorzeichen des Ergebnisses stets demjenigen des zweiten Operanden. In C und Java entspricht das Vorzeichen des Ergebnisses dagegen demjenigen des ersten Operanden. (Ruby stellt auch eine
remainder
-Methode zur Verfügung, die sich in puncto Vorzeichen und Größe wie der C-Modulo-Operator verhält.)
----
Ruby übernimmt zudem den Operator
**
aus Fortran zur Potenzierung. Exponenten brauchen keine Integer zu sein:
x**4 # Das ist dasselbe wie x*x*x*x
x**-1 # Dasselbe wie 1/x
x**(1/3.0) # Die Kubikwurzel von x
x**(1/4) # Huch! Durch Integer-Division ist das x**0, also immer 1
x**(1.0/4.0) # Das ist die vierte Wurzel aus x
Wenn mehrere Potenzierungen zu einer einzelnen verknüpft werden, werden sie von rechts nach links ausgewertet. Daher ist
4**3**2
dasselbe wie
4**9
, nicht wie
64**2
.
Die Potenzierung kann zu sehr großen Ergebnissen führen. Denken Sie daran, dass Integer beliebig groß werden können, dass
Float
-Objekte aber keine größeren Zahlen als
Float::MAX
speichern können. Daher liefert der Ausdruck
10**1000
ein exaktes Integer-Ergebnis, während der Ausdruck
9.9**1000
zu dem
Float
-Wert
Infinity
überläuft.
Fixnum
- und
Bignum
-Werte unterstützen die Standardoperatoren zur Bitmanipulation (
~
,
&
,
|
,
^
,
>>
und
<<
), die auch in C, Java und vielen anderen Sprachen vorkommen. (Siehe „4.6 Operatoren“ für Details.) Zusätzlich können Integer-Werte auch wie Arrays indexiert werden, um einzelne Bits zu ermitteln (aber nicht zu setzen). Der Index 0 liefert das niedrigstwertige Bit:
even = (x[0] == 0) # Eine Zahl ist gerade, wenn das niedrigstwertige Bit 0 ist
3.1.4 Binärfließkomma und Rundungsfehler
Die meiste Computerhardware und die meisten Computersprachen (darunter auch Ruby) bilden Näherungswerte von reellen Zahlen mithilfe einer Fließkommadarstellung wie der Ruby-Klasse
Float
. Aus Gründen der Hardware-Effizienz sind die meisten Fließkommadarstellungen Binärdarstellungen, die Brüche wie
1/2
,
1/4
und
1/1024
exakt darstellen können. Unglücklicherweise sind die am häufigsten verwendeten Brüche (insbesondere bei der Durchführung von Finanzkalkulationen)
1/10
,
1/100
,
1/1000
und so weiter. Binäre Fließkommadarstellungen können so einfache Zahlen wie
0.1
nicht exakt darstellen.
Float
-Objekte besitzen eine hohe Genauigkeit und können einen guten Näherungswert von
0.1
bilden, aber die Tatsache, dass diese Zahl nicht genau dargestellt werden kann, führt zu Problemen. Betrachten Sie den
Weitere Kostenlose Bücher