Digital Signal Processing Reference
In-Depth Information
der Wert von
c
nicht
0.4, sondern 0.0, weil der Ausdruck
a/b
auf der
rechten Seite den
int
-Wert 0 ergibt, der bei der nachfolgenden Zuweisung
auf
c
automatisch auf den
double
-Wert 0.0 konvertiert wird.
Wollten wir
a/b
als Gleitkommaoperation berechnen, so mussen
wir zunachst mindestens einen der Operanden in einen Gleitkommawert
umwandeln, beispielsweise durch einen expliziten
type cast
(double)
:
B
Java-Noti zen
double c = (double) a / b;
Dabei ist zu beachten, dass
(double)
nur den unmittelbar nachfolgenden
Wert
a
betrifft und nicht den gesamten Ausdruck
a/b
,d.h.derWert
b
behalt den Typ
int
.
Beispiel
Nehmen wir z. B. an, wir mochten die Pixelwerte
p
i
eines Bilds so skalie-
ren, dass der momentan großte Pixelwert
p
max
auf 255 abgebildet wird
(s. auch Kap. 5). Mathematisch werden die Pixelwerte einfach in der
Form
p
i
p
max
·
q
←
255
skaliert und man ist leicht versucht, dies 1:1 in Java-Anweisungen um-
zusetzen, etwa so:
int p_max = ip.getMaxValue();
...
int p = ip.getPixel(u,v);
int q = (p / p_max) * 255;
...
Wie wir leicht vorhersagen konnen, bleibt das Bild schwarz, mit Aus-
nahme der Bildpunkte mit dem ursprunglichen Pixelwert
p_max
(was
wird mit diesen?). Der Grund liegt wiederum in der Division
(p/p_max)
mit zwei
int
-Operanden, wobei der Divisor (
p_max
) in den meisten
Fallen großer ist als der Dividend (
p
) und die Division daher null er-
gibt.
Naturlich konnte man die gesamte Operation auch (wie oben gezeigt)
mit Gleitkommawerten durchfuhren, aber das ist in diesem Fall gar nicht
notwendig. Wir konnen stattdessen die Reihenfolge der Operationen ver-
tauschen und die Multiplikation zuerst durchfuhren:
int q = p * 255 / p_max;
Die Multiplikation
p * 255
erzeugt zunachst große Zwischenwerte, die
fur die nachfolgende (ganzzahlige) Division nunmehr kein Problem dar-
stellen. In Java werden ubrigens arithmetische Ausdrucke auf der glei-
chen Ebene immer von links nach rechts berechnet, deshalb sind hier
auch keine zusatzlichen Klammern notwendig (diese wurden aber auch
nicht schaden).