Fehlerhafte Potenzierung

Moderator: Rockford

Antworten
Benutzeravatar
GoodByteXL
Beiträge: 257
Registriert: 18.08.2021 12:10
Has thanked: 6 times
Been thanked: 56 times
Kontaktdaten:

Fehlerhafte Potenzierung

Beitrag von GoodByteXL »

Alle mir vorliegenden Versionen von BASIC XL und BASIC XE potenzieren falsch !!!

Gibt es dafür einen Fix?
Hat jemand Versionen ohne den Fehler?

Benutzeravatar
dl7ukk
Beiträge: 531
Registriert: 25.08.2021 23:03
Has thanked: 69 times
Been thanked: 99 times
Kontaktdaten:

Re: Fehlerhafte Potenzierung

Beitrag von dl7ukk »

Roland müßte sowas wissen.

Ich habe ihn mal "angestoßen" :D

Online
Benutzeravatar
andymanone
Beiträge: 2498
Registriert: 17.08.2021 12:34
Wohnort: Berlin - Suburban
Has thanked: 491 times
Been thanked: 789 times
Kontaktdaten:

Re: Fehlerhafte Potenzierung

Beitrag von andymanone »

Ist das nicht noch zu früh für ihn von der Uhrzeit her ;)?
Ressortleiter Hardware - Save the past and use the future!© andYManOne / Demozoo / Youtube

Benutzeravatar
atarixle
Beiträge: 271
Registriert: 18.06.2021 21:19
Has thanked: 29 times
Been thanked: 51 times
Kontaktdaten:

Re: Fehlerhafte Potenzierung

Beitrag von atarixle »

Wirklich korrekt rechnen nur richtige Mathematik-Programme, á la R oder MatLab.

Programmiersprachen nutzen die mangelhaften, bequemen Implementierungen der Prozessoren oder Betriebssysteme.

Dem Atari 8 Bit mit seinem knappen Speicher - und auch jedem anderen Rechner auf dieser Welt - dürfte es unmöglich sein, wirklich alle Regeln der Mathematik zu beherrschen (das dürften um die unendlich viele sein).

Aber um welche Potenzen geht es denn überhaupt? Was sagen Atari BASIC und Turbo-BASIC zu genau dieser Aufgabe? Ohne dass ich von BASIC XL den Hauch einer Ahnung habe, wage ich mal zu fragen: Gab es dies nicht in einer Integer-Variante gab, das ausschließlich ganze Zahlen verarbeitet?

Benutzeravatar
GoodByteXL
Beiträge: 257
Registriert: 18.08.2021 12:10
Has thanked: 6 times
Been thanked: 56 times
Kontaktdaten:

Re: Fehlerhafte Potenzierung

Beitrag von GoodByteXL »

atarixle hat geschrieben:
23.02.2022 21:23
Aber um welche Potenzen geht es denn überhaupt?
Bildschirmfoto vom 2022-02-24 08-03-16.png
Bildschirmfoto vom 2022-02-24 08-03-16.png (45.38 KiB) 3782 mal betrachtet
Erst bei großen Potenzen findet sich da kein Unterschied mehr, wenn gleich auch da aufgrund des MathPacks im XL noch Fehler auftreten.
Bildschirmfoto vom 2022-02-24 08-16-28.png
Bildschirmfoto vom 2022-02-24 08-16-28.png (36.19 KiB) 3782 mal betrachtet
Unter Linux-Taschenrechner:
Bildschirmfoto vom 2022-02-24 08-14-40.png
Bildschirmfoto vom 2022-02-24 08-14-40.png (38.5 KiB) 3782 mal betrachtet
Und selbst hier:
?4^2
15.9999996

Ready

Fragt sich halt, ob nur die Ausgabe 'anders' ist oder tatsächlich ein Fehler drinsteckt.

Benutzeravatar
atarixle
Beiträge: 271
Registriert: 18.06.2021 21:19
Has thanked: 29 times
Been thanked: 51 times
Kontaktdaten:

Re: Fehlerhafte Potenzierung

Beitrag von atarixle »

Ich vermute ganz stark, dass das was mit der Art und Weise zu tun hat, in der Zahlen intern gespeichert werden.

In Atari-BASIC ist es das BSD-System, welches sehr gut mit dem Dezimalsystem kompatibel ist. Genau genommen ist es ein Abbild dessen. Jedes Halb-Byte beinhaltet eine dezimal-Ziffer.

BASIC-XL scheint Zahlen im Binärformat zu speichern. Das ist effizienter, weil ein größerer möglicher Wertebereich abgedeckt wird, hat aber den Nachteil, dass teilweise Abstriche bei der Genauigkeit gemacht werden müssen, und zwar sowohl bei großen Zahlen ohne Komma, als auch bei vielen Stellen hinter dem Komma. Viele Dezimalbrüche mit Vielfachen von 2 im Nenner enden schnell als periodischer Bruch im Binärbereich (obwohl dies doch eigentlich die Königsdisziplin der Binärzahlen sein sollte, aber eben nur vor dem Komma).

Wieso dieser Fehler nun schon bei einer so kleinen Zahl wie 64^2 vorkommt (4096 = 2^12, sprich, das 13. Bit ist gesetzt), wundert mich jedoch schon - vielleicht hat das was mit der Art und Weise zu tun, wie BASIC-XL Potenzen ausrechnet. Sehr wahrscheinlich rechnet es diese Zahl als floating point aus. Was sagt BASIC-XL denn zu der zu Grunde liegenden Rechnung (also Print 64*64)?

Dietrich
Beiträge: 74
Registriert: 20.09.2021 20:59
Has thanked: 8 times
Been thanked: 34 times
Kontaktdaten:

Re: Fehlerhafte Potenzierung

Beitrag von Dietrich »

Zunächst stellt sich die Frage: Was heißt genau "das Rechenergebnis ist falsch"?

Streng genommen kann keine Programmiersprache selbst simple Divisionen exakt als Dezimalbruch darstellen. So ist z.B. 1/3 = 0.333333... ein unendlicher Dezimalbruch, der auf Computern mit endlichem Speicher nicht exakt darstellbar ist. Oder z.B. Wurzel aus 2, eine irrationale Zahl, die gar kein Muster in den Nachkommastellen aufweist.

Eine sinnvolle Definition wäre, dass das Ergebnis als richtig angesehen wird, wenn eine bestimmte Anzahl von Dezimalstellen stimmen (bei BASIC: 9), wobei die letzte Stelle natürlich gerundet ist. Das ist bei den transzendenten Funktionen wie SIN, LOG, EXP in den BASIC-Versionen praktisch nie der Fall, weil die per Taylorentwicklung mit ein paar Gliedern berechnet werden (wieviel weiß ich nicht genau - aber zu wenig für 9 Stellen Genauigkeit). Dafür gibt es auch Routinen im Mathpack im OS-ROM, z.B. EXP=$DDC0 und LOG=$DECD und die davon genutzte allgemeine Polynomberechnung PLYEVL=$DD40 und auch im BASIC direkt (z.B. SIN). Das ist aber nur ein Näherungsverfahren - je weiter das Funktionsargument vom Entwicklungspunkt des Taylorpolynoms abweicht, desto ungenauer das Ergebnis (im allgemeinen).
Genaueres siehe hier: https://de.wikipedia.org/wiki/Taylorreihe

Zur Potenzierung: ATARI-BASIC berechnet A^B, indem es EXP(B*LOG(A)) berechnet (genauer: es wird nur die Mantisse von A genommen), was das gleiche Ergebnis liefert. Daher verwendet BASIC hier sogar 2 Taylorentwicklungen, nämlich für EXP und LOG. Das macht BASIC XL so und auch ATARI-BASIC Ver.A, weswegen da etwas zu kleine Werte herauskommen. ATARI-BASIC C macht das auch, erkennt aber, dass Basis und Exponent ganzzahlig sind und rundet das Ergebnis einfach auf einen ganzzahligen Wert. Turbo-BASIC ist da schlauer und verwendet bis zu einer gewissen Grenze mehrfache Multiplikation, weswegen Turbo-BASIC bei der ganzzahligen Potenzierung viel viel schneller als ATARI-BASIC ist. Bei "großen" Werten machen die BASIC-Versionen einfach das gleiche, deshalb wird auch das gleiche angezeigt - aber auch da gibt es wegen des Näherungsverfahrens je nach Basis und Exponent Abweichungen vom "korrekten" Ergebnis.

Benutzeravatar
GoodByteXL
Beiträge: 257
Registriert: 18.08.2021 12:10
Has thanked: 6 times
Been thanked: 56 times
Kontaktdaten:

Re: Fehlerhafte Potenzierung

Beitrag von GoodByteXL »

Danke an Dietrich für die ausführlichen Erläuterungen.

Damit lässt sich ggf. die Entwicklungsgeschichte von Atari BASIC und BASIC XL besser sortieren:

Wenn Atari BASIC A dieses Verhalten zeigt, mein Atari BASIC B aber schon nicht mehr, dann liegt BASIC XL zeitlich dazwischen UND vor der Veröffentlichung von Atari 600 XL / 800XL. Das erklärte dann auch, wieso die im Handbuch von BASIC XL beschriebenen Grafikstufen nur die vom Atari 400 / 800 umfassen und die vom XL / XE fehlen. Da bedeutete dann auch, dass die Benennung von BASIC XL nicht auf den Atari XL reflektiert. Ggf. muss ich da noch BASIC A und A+ mal anschauen.

Da BASIC XE dieses Verhalten bis zur letzten Version ebenfalls zeigt, scheint hier keine 'Verbesserung' für den einfachen User eingebracht worden zu sein.

Muss man beim Programmieren mit BASIC XL und BASIC XE halt drauf achten.

atarixle hat geschrieben:
24.02.2022 14:57
Was sagt BASIC-XL denn zu der zu Grunde liegenden Rechnung (also Print 64*64)?
Ein Bild sagt mehr ...
Bildschirmfoto vom 2022-02-25 07-57-50.png
Bildschirmfoto vom 2022-02-25 07-57-50.png (40.23 KiB) 3697 mal betrachtet

Benutzeravatar
atarixle
Beiträge: 271
Registriert: 18.06.2021 21:19
Has thanked: 29 times
Been thanked: 51 times
Kontaktdaten:

Re: Fehlerhafte Potenzierung

Beitrag von atarixle »

GoodByteXL hat geschrieben:
25.02.2022 08:14
atarixle hat geschrieben:
24.02.2022 14:57
Was sagt BASIC-XL denn zu der zu Grunde liegenden Rechnung (also Print 64*64)?
Ein Bild sagt mehr ...
Bildschirmfoto vom 2022-02-25 07-57-50.png
Ja, ich würde sagen, das belegt Dietrich's Erklärung ganz deutlich.
Beim Lesen fiel es mir wieder ein, Atari BASIC braucht für ein einfaches 2^x eine halbe Ewigkeit und Turbo-BASIC konnte das schon immer wesentlich schneller. Durchläuft man ohnehin eine Schleife, kann man die Potenz von 2 bis auf eine Addition herunterbrechen und Rechenzeit sparen (in jedem Durchlauf x+x rechnen).
Damals las ich es auch im HC Sonderheft, dass TB Potenzen anders berechnet als Atari-BASIC.

Danke, Dietrich, ich habe viel aus deinem Posting gelernt.

Benutzeravatar
GoodByteXL
Beiträge: 257
Registriert: 18.08.2021 12:10
Has thanked: 6 times
Been thanked: 56 times
Kontaktdaten:

Re: Fehlerhafte Potenzierung

Beitrag von GoodByteXL »

GoodByteXL hat geschrieben:
25.02.2022 08:14
Ggf. muss ich da noch BASIC A und A+ mal anschauen.
Hat die gleichen Eigenschaften und rundet nicht passend.

Muss man halt nach Alt-BASIC-Sitte handhaben:
Bildschirmfoto vom 2022-02-25 11-42-44.png
Bildschirmfoto vom 2022-02-25 11-42-44.png (36.9 KiB) 3681 mal betrachtet

Dietrich
Beiträge: 74
Registriert: 20.09.2021 20:59
Has thanked: 8 times
Been thanked: 34 times
Kontaktdaten:

Re: Fehlerhafte Potenzierung

Beitrag von Dietrich »

Hier noch ein 5-Minuten-Youtube-Video, das die Taylorentwicklung anhand der Sinus-Funktion kurz erklärt:
https://www.youtube.com/watch?v=5xZNmo1qOIE
(Tangente = Gerade, die sich an einer Stelle an den Graph einer Funktion anschmiegt, 1.Ableitung = Steigung der Tangente)

Dietrich
Beiträge: 74
Registriert: 20.09.2021 20:59
Has thanked: 8 times
Been thanked: 34 times
Kontaktdaten:

Re: Fehlerhafte Potenzierung

Beitrag von Dietrich »

Ich habe mal im Mathpack nachgeschaut: Es werden Taylorpolynome immerhin 9. Grades benutzt. Dafür sind 17 Multiplikationen nötig (9 für die Koeffizienten und 8 für die Potenzen des Polynoms). Bei der Potenzierung sind 34 Multiplikationen nötig, weil 2 Taylorpolynome benutzt werden (für EXP und LOG). Kein Wunder, dass ATARI-BASIC bei der Potenzierung so grottenlangsam ist.

wosch
Beiträge: 489
Registriert: 17.08.2021 21:16
Wohnort: Reutlingen
Has thanked: 454 times
Been thanked: 142 times
Kontaktdaten:

Re: Fehlerhafte Potenzierung

Beitrag von wosch »

Ich hab zwar von dem Mathe-Gedöns keinen Plan :D , aber sehr interessant was das so nach 30-40 Jahren alles rauskommt. Respekt.
Gruß
Wolfgang

Bernd
Beiträge: 371
Registriert: 17.08.2021 17:22
Has thanked: 68 times
Been thanked: 139 times
Kontaktdaten:

Re: Fehlerhafte Potenzierung

Beitrag von Bernd »

Mit Dietrich muss man immer Rechnen :D , er hat ja auch ein abgeschlossenes Mathe Studium.

Erhard
Beiträge: 555
Registriert: 04.11.2021 15:52
Has thanked: 52 times
Been thanked: 111 times
Kontaktdaten:

Fehlerhafte Potenzierung

Beitrag von Erhard »

Ich habe jetzt endlich verstanden, warum ich den Maschinencode der entsprechenden Routinen im Mathe-ROM des Atari nicht verstehe :-/

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast