Abhängigkeit der Stabilität von der Programmiersprache?

Neue Frage »

CoMa123 Auf diesen Beitrag antworten »
Abhängigkeit der Stabilität von der Programmiersprache?
Meine Frage:
Guten Abend,

als wir angefangen haben, uns mit der Stabilität von Algorithmen auseinanderzusetzen, haben wir als anschauliches Beispiel die Funktion f(x)=x^3 + 12*a^2*x - 6*a*x^2 - 8*a^3 betrachtet, die alternativ auch als f(x)=(x-2a)^3 dargestellt werden kann.

Die Auswertung der auf der ersten Art und Weise implementierten Funktion an der Stelle x=10000000 mit a=4999999 lieferte 393216, wohingegen die alternative Implementierung zum korrekten Ergebnis führte.

Aus Interesse habe ich vorhin beide Varianten mal in BlueJ ausprobiert und es wurden beide Male dasselbe richtige Ergebnis ausgegeben. Was mich zu der Frage im Titel führt: Hängt die Stabilität von der Programmiersprache ab?

Für Antworten danke ich im Voraus.


Meine Ideen:
Ich glaube eigentlich nicht, dass eine solche Abhängigkeit besteht, aber worauf ist dann der Unterschied zurückzuführen?
HAL 9000 Auf diesen Beitrag antworten »

Es hängt wohl weniger mit der Programmiersprache zusammen - schon eher, in welcher Reihenfolge ein Term wie der genannte intern verrechnet wird.

Das kann selbst in ein- und derselben Programmiersprache wie etwa C/C++ zu unterschiedlichen Resultaten führen, je nachdem, mit welchen Optimierungsoptionen man das ganze kompiliert. Augenzwinkern
CoMa123 Auf diesen Beitrag antworten »

Ah okay, danke für die Antwort smile
RavenOnJ Auf diesen Beitrag antworten »
RE: Abhängigkeit der Stabilität von der Programmiersprache?
Zitat:
Original von CoMa123


als wir angefangen haben, uns mit der Stabilität von Algorithmen auseinanderzusetzen, haben wir als anschauliches Beispiel die Funktion f(x)=x^3 + 12*a^2*x - 6*a*x^2 - 8*a^3 betrachtet, die alternativ auch als f(x)=(x-2a)^3 dargestellt werden kann.

Die Auswertung der auf der ersten Art und Weise implementierten Funktion an der Stelle x=10000000 mit a=4999999 lieferte 393216, wohingegen die alternative Implementierung zum korrekten Ergebnis führte.

Aus Interesse habe ich vorhin beide Varianten mal in BlueJ ausprobiert und es wurden beide Male dasselbe richtige Ergebnis ausgegeben. Was mich zu der Frage im Titel führt: Hängt die Stabilität von der Programmiersprache ab?


Ehrlich gesagt weiß ich nicht, was dein Beispiel mit dem Thema "Stabilität von Algorithmen" zu tun hat und was "Stabilität einer Programmiersprache" bedeuten soll. Es ist einfach so, dass in Sprachen wie C/C++ oder Java jeder "normale" numerische Datentyp (short, int, long, long long) seine Größenbeschränkungen hat. Dass 1e7^3 nicht korrekt berechnet wird, liegt einfach daran, dass das x vermutlich vom Typ int (bzw. long) ist und sehr wahrscheinlich 4 Byte (oder 8 Byte) groß ist. Damit können nur Zahlen bis maximal 2147483647=2^31-1 (oder 9223372036854775807=2^63-1) dargestellt werden. Wenn du also (1e7)^3 rechnest, so sprengt das Ergebnis 10^21 einfach den Rahmen der möglichen Zahldarstellung, egal ob 4 Byte oder 8 Byte.

In Java kannst du in so einem Fall mit dem Datentyp BigInteger rechnen, in Haskell mit dem Typ Integer. Wenn du in Haskell einfach (10^7)^3 bildest, erhältst du das richtige Ergebnis 10^21 vom Typ Integer. Wenn du allerdings den Datentyp Int erzwingst mit (10^7::Int)^3 so erhältst du das falsche Ergebnis -559939584.
HAL 9000 Auf diesen Beitrag antworten »

Ja, ich muss gestehen, das Beispiel im Eröffnungsposting nicht gründlich genug angesehen zu haben:

Programmiersprache hin oder her, zunächst mal sollte der Algorithmus vermeidbare numerische Klippen von vornherein umschiffen, wie etwa hier im obigen Beispiel solche Auslöschungseffekte.

Der Effekt tritt oben übrigens selbst dann ein, wenn Floating-Point-Werte sog. doppelter Genauigkeit (in C/C++ "double") sind:

Die haben 53 Bit Mantisse, das entspricht in etwa 16 Dezimalstellen. Wenn nun aber das tatsächliche Ergebnis



ist und der Zwischenwert aber , dann sind diese 16 Stellen mehr als aufgebraucht, es kann nix gescheites mehr rauskommen, der angegebene numerisch ermittelte Wert liegt in etwa in der Größenordnung 16 Stellen hinter den größten Zwischenwerten - im völlig erwartbaren Rahmen bei Verwendung von "double". Augenzwinkern
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »