Post by Ingo R. HomannMuss man in Smalltalk den Typ der Variablen deklarieren
Nein. Das ist unmöglich.
Post by Ingo R. Homannoder wird das automatisch gemacht?
Ja.
Post by Ingo R. HomannWelchen Typ hat "1" (int?)
SmallInteger
Post by Ingo R. Homann"0.1" (decimal?),
"0.25" (binary double?)
Beides ist Float. VisualWorks kennt "0.1s" für ScaledDecimal, so meine
ich. Mit "0.25d" würde man ein Double anlegen.
Fraction. Zu beachten ist aber, dass das kein Literal ist, sondern wir
sehen hier "/" als Factory Methode, die aus zwei Integern ein
Fraction-Objekt macht. "1/3*3" wäre demzufolge 1 (ein SmallInteger).
Post by Ingo R. HomannWas passiert, wenn man z.B. "decimal 0.1" und "fract 1/3" addiert? Geht
das? Welchen Typ hat das Ergebnis?
Frage, was passiert, wenn man exakte Zahlen addiert: Hier wird zwischen
Fraction und Integer (das ist die gemeinsame Oberklasse von SmallInteger
und LargeInteger die keine Obergrenze haben, als BigInteger in Java
entsprechen) hin- und herkonvertiert wie man es vermutet.
Ist ein Objekt ein inexakter Typ, wird das Ergebnis ebenfalls inexakt,
meist ein Double. Was bei ScaledDecimal und Fraction passiert, weiss
ich nicht.
Post by Ingo R. HomannKann man Variablen (für Performance-kritische Sachen) so deklarieren,
dass sie immer als "double" repräsentiert werden (*), auch auf die
Nein. Man deklariert in Smalltalk keine Variablentypen. Ein Objekt ist
ein double oder ist es nicht. Das hat nichts mit der Variablen zu tun.
Post by Ingo R. HomannGefahr hin, dass man dann mit den Rundungsfehlern leben muss?
Wenn du doubles willst, schreib das hin.
12 asDouble / 7
oder
12.0d / 7.0d
(12d kann man nicht schreiben, denn das würde die Nachricht #d an den
Integer 12 schicken).
Es ist eher so, dass man manchmal auf Fraction verzichten möchte und
lieber bei Integer-Objekten bleiben möchte. Dafür gibt es eben "/", was
ggf. automatisch Brüche erzeugt, noch eine Extramethode: //. Ein
(4 / 3) asInteger
würde zwar das selbe geben wie "4 // 3", aber erstmal einen Bruch bauen,
um den dann wieder umzuwandeln.
Post by Ingo R. Homann(*) Ich unterstelle, dass "natives" Rechnen mit double schneller ist als
Rechnen mit unterschiedlichen Typen + Konvertierungen + Typ-Checks
Garantiert. Existierende Smalltalk-Systeme sind aber nicht gut mit
doubles (64 bit), da sie diese immer boxen müssen. Daher ist bei
VisualWorks der Standardtyp Float, was eine 30-bit-Fließkommazahl ist.
Man kann sich damit behelfen, Vektorbefehle mit DoubleArrays zu
definieren und seine Algorithmen entsprechend anzupassen. Das spart das
ewige boxen.
--
Stefan Matthias Aust