amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > value to dezimal string [ - Suche - Neue Beiträge - Registrieren - Login - ]

1 -2- [ - Beitrag schreiben - ]

25.07.2009, 15:45 Uhr

jolo
Posts: 110
Nutzer
@Holger

Zitat:
Oder einfach nur dämlich ausgedrückt, also Du von den Werten "von 1000000000 bis 1" gesprochen hast.

Da muss ich Dir doch glatt Recht geben.
Zu meiner Entschuldigung muss ich aber anführen, dass ich davon ausgegangen bin, dass man versteht was auch schon innerhalb der ursprünglichen Routine geschieht:
Nämlich (damals) langsame Divisionen durch schnellere Subtraktionen zu ersetzen.


Zitat:
Ich bin kein Profi, nur ein Einäugiger unter Blinden.
Zitat:
Nur äußerst eingebildet, würde es offensichtlich besser treffen.


Du kannst mich halten für was Du willst.

Was ich nicht mag, und das betrifft nicht nur programmieren, ist Kritik zu äußern ohne Lösungen aufzuzeigen. Auch etwas als schlecht programmiert zu bezeichnen, wenn man die Vorgehensweise des betreffenden Codes noch nicht richtig verstanden hat, und damit dann anderen ein falsches Bild dessen vermittelt, was als Lösung herangezogen werden kann, halte ich auch nicht für sonderlich hilfreich.

Ich habe zum Nachvollziehen des Quellcode nicht einmal eine Minute gebraucht obwohl ich mein letztes größeres Assembler-Projekt in 1995 geschrieben habe. Aufgefallen ist mir nämlich der Wert 10000; da hätte es auch bei Dir klingeln können. 10000 wurde früher immer zum Subtrahieren von Wort-Werten benutzt und danach durch 10 geteilt, spricht 1000. 1000 durch 10 = 100 - und so fort. Demnach habe ich nur nach Übereinstimmungen gesucht, et voila, ich wusste wie der Code funktioniert.

Ich erwarte von keinem Leser dieses Forums dass er es auch erkennt, aber ich denke dass Kritik nur der äußern darf, der auch Lösungen parat hat. Einfach nur etwas schlecht zu reden geht meiner Meinung nach nicht in Ordnung. Und nur deshalb habe ich mich überhaupt eingeschaltet.


Zitat:
[...] können Dir nicht nur Einäugige helfen.

Aber nicht mehr lange. Werde das Gefühl nicht los, dass ich Grünen Star bekomme...


So, nachdem Du Deine Meinung kund getan hast und ich meine, können wir uns wieder ignorieren?


Grüße


[ - Antworten - Zitieren - Direktlink - ]

25.07.2009, 16:38 Uhr

whose
Posts: 2156
Nutzer
Also zuerst mal, ich finde den Thread hier äußerst lehrreich... ich stelle fest, daß ich in der langen Zeit, in der ich auf die "weit größeren Fähigkeiten eines Compilers in Sachen Optimierung" vertraut habe, eine Menge verlernt habe ;)

Zu dem Disput: Wie wäre es, wenn ihr Euch darauf einigt, daß jolo derjenige mit der größeren Erfahrung in Sachen Assembler (sichtbar bisher nur M68K/AmigaOS, aber vielleicht auch für andere CPUs/OSse?) ist, wohingegen Holger derjenige ist, der die größere Erfahrung im Umgang mit höheren Programmiersprachen und deren Modellen, vor allem Java & Co., mitbringt?

Eventuell vereinfacht sich der Umgang miteinander dann etwas, vor allem, wenn jeder den Erfahrungsschatz des anderen respektiert, in seinen Beiträgen berücksichtigt und damit Mistverständnissen wie z.B. "4 Gigabyte" zumindest ein wenig vorbeugt...

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

25.07.2009, 20:43 Uhr

jolo
Posts: 110
Nutzer
@whose:

Zitat:
Also zuerst mal, ich finde den Thread hier äußerst lehrreich... ich stelle fest, daß ich in der langen Zeit, in der ich auf die "weit größeren Fähigkeiten eines Compilers in Sachen Optimierung" vertraut habe, eine Menge verlernt habe ;)

Das wird vielen so gehen, mir auch. Kniffe die wir früher aus dem Effeff beherrschten, haben wir verlernt, jedenfalls ich für meine Person zum Großteil.

Zum angeblichen Disput.
Es gibt keinen. Ich ignoriere Holgers Beiträge normalerweise.
Zudem geht es nicht darum, wer was besser kann. Schwanzvergleiche sind was für männlich pubertierende Kinder - aus dem Alter sind wir raus. Holger wird viele Dinge in Sachen Programmierung besser können als ich. Das stört mich nicht, noch weckt das meinen Neid. Es wäre auch komisch wenn es anders herum wäre. Ich bin nach wie vor ein Hobby-Programmierer (und noch dazu ziemlich faul) der seine Brötchen mit ganz anderen Sachen verdient. Was mich jedoch an Holgers Beiträgen stört, sind die darin auftauchenden emotionalen Ausbrüche und der Rückgriff auf Strohmann-Argumente. Demnach werde ich weiter versuchen Holgers Beiträge zu ignorieren, egal was Du davon hältst. Sorry whose.


Grüße

[ - Antworten - Zitieren - Direktlink - ]

25.07.2009, 22:37 Uhr

AGSzabo
Posts: 1663
Nutzer
@jolo:

> Kniffe die wir früher aus dem Effeff beherrschten, haben wir verlernt, jedenfalls ich für meine Person zum Großteil.



haha, ich bekomme antworten und finde lösungen im halbschlaf, sehe programmzeilen vor dem inneren auge!
--
e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ - Antworten - Zitieren - Direktlink - ]

26.07.2009, 18:51 Uhr

Thore
Posts: 2266
Nutzer
Zitat: Warum terminierst du auf 3 Nullen?
Antwort: Ist nicht nötig, war nur zu Fehlervermeidung drin, für die Schleife (falls die zu weit geht), natürlich kannst auf eine Null den String terminieren. Wie gesagt, war auch nur Code from the scratch und nix optimiert oder aufgeräumt.
Und ist 68000 Code, die Version für 020+ kommt eben aus dem Zahlenbereich raus. Aber man sieht, auch auf dem 68000 sind Werte bis 655359 möglich. Kommt immer drauf an was man machen will.
Sorry für die verspätete Antwort ;)

[ - Antworten - Zitieren - Direktlink - ]

26.07.2009, 21:38 Uhr

Blackbird
Posts: 634
Nutzer
@jolo:

Zum angeblichen Disput.
Es gibt keinen. Ich ignoriere Holgers Beiträge normalerweise.


Ich fände es interessant welcher Schwanz nun größer ist, der Valueschwanz oder der Dezimaldödel :smokin:

Zumal jeder weis, das bei Frauen 20cm zwischen ordinären 10 Zentimetern oder gar bis 40 Zentimeteren reichen kann.
Männer schätzen das ohnehin wesentlich besser per Bierauge ein :P

Das ist wie bei Anglern wenn man sie nach der Länge des gefangenen Fisches fragt, da bekommt man dann auch "ganz gezielte Angaben" I-) :D

Also, mal Butter bei die Fische: Wie lang ist "Value" und wie lange "Dezimal" ? :nuke: :O
--
regards
Blackbird

PerfectPaint : supportOS4@amiforce.de HP: http://perfectpaint.amiforce.de/
Have also a look at my personal Website:
http://www.blackbird-net.de

[ - Antworten - Zitieren - Direktlink - ]

10.08.2009, 21:07 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von jolo:
Zu meiner Entschuldigung muss ich aber anführen, dass ich davon ausgegangen bin, dass man versteht was auch schon innerhalb der ursprünglichen Routine geschieht:
Nämlich (damals) langsame Divisionen durch schnellere Subtraktionen zu ersetzen.

Die ursprüngliche Routine habe ich durchaus verstanden. Allerdings werden dort nirgendwo Divisionen eingespart. Divisionen einzusparen wurde erst von Dir vorgeschlagen.
Zwar bezweifle ich, dass die Einsparungen die Menge an Subtraktionen und Iterationen wett machen können, allerdings stellt Dein letzter code in der Tat eine deutliche Verbesserung gegenüber dem ursprünglichen code dar, der ja Divisionen und Subtraktionen in unzähligen Iterationen enthielt und trotzdem nicht mit 32 Bit-Zahlen umgehen konnte.
Zitat:
Was ich nicht mag, und das betrifft nicht nur programmieren, ist Kritik zu äußern ohne Lösungen aufzuzeigen.
Da der Threaderöffner ja laut eigener Aussage nicht an Lösungen interessiert war, sondern nur aus Spaß an der Freude diskutieren wollte, war es ausreichend, ihm Lösungsansätze aufzuzeigen, die natürlich in letzter Konsequenz überflüssig waren, weil er ja inzwischen RawDoFmt benutzt, was für ein GUI-Projekt, das auf hauptsächlich Systemen mit truecolor-Grafikkarten (insb. UAE und AOS4) läuft, vielleicht die auch beste Wahl ist.
Zitat:
Auch etwas als schlecht programmiert zu bezeichnen, wenn man die Vorgehensweise des betreffenden Codes noch nicht richtig verstanden hat, und damit dann anderen ein falsches Bild dessen vermittelt, was als Lösung herangezogen werden kann, halte ich auch nicht für sonderlich hilfreich.
Die Lösung, die Du gepostet hast, ist durchaus sinnvoll, wenn es darum geht, auf einem 68000, also nicht 68020+, eine 32 Bit Zahl zu formatieren.

Wenn man von dieser speziellen Anforderung absieht, von der nie gesagt wurde, dass sie gebraucht werden würde, gibt es den 08/15-Standardalgorithmus, der sowohl das kann, was der ursprüngliche Code konnte (16 Bit-Zahlen auf 68000), als auch 32 Bit-Zahlen auf 68020+ formatieren kann, und um Welten effizienter arbeitet (und auch zusätzlich optimiert werden könnte).

Da man auf diesen Standardalgorithmus von selbst kommen kann, haben eben einige erst einmal Hinweise statt vorgekauten code gepostet. Und gefragt, wie man auf diesen absurden (ursprünglichen) Code kommt.
Zitat:
Ich erwarte von keinem Leser dieses Forums dass er es auch erkennt, aber ich denke dass Kritik nur der äußern darf, der auch Lösungen parat hat.
Parat haben und jemandem vorkauen, der alle paar Tage mit einer neuen Frage dieser Art kommt, sind zwei verschiedene paar Schuhe.

Inzwischen wurden sowohl Dein spezieller 68000-Code für 32 Bit-Zahlen, als auch der Standard-Algorithmus dem Threaderöffner vorgekaut, der ohnehin jetzt RawDoFmt verwendet. Wenn Du Dir jetzt den Thread noch mal in Ruhe anschaust, wirst Du feststellen, dass ich den Threaderöffner mehrfach danach gefragt habe, worauf es ihm eigentlich wirklich ankommt, eben weil ich ihm durchaus Lösungen anbieten kann, aber eben keine Lust dazu habe, Perlen vor die Säue zu werfen, wie es hier erneut geschehen ist.

Natürlich hätte man auch sofort "Benutz das Betriebssystem!" schreiben können, dass wäre allerdings, auch wenn es das ist, was er jetzt letztendlich tut, auch wieder als Arroganz ausgelegt worden.

Zitat:
So, nachdem Du Deine Meinung kund getan hast und ich meine, können wir uns wieder ignorieren?
Wie Du willst.

Zitat:
Original von whose:
Zu dem Disput: Wie wäre es, wenn ihr Euch darauf einigt, daß jolo derjenige mit der größeren Erfahrung in Sachen Assembler (sichtbar bisher nur M68K/AmigaOS, aber vielleicht auch für andere CPUs/OSse?) ist, wohingegen Holger derjenige ist, der die größere Erfahrung im Umgang mit höheren Programmiersprachen und deren Modellen, vor allem Java & Co., mitbringt?

Nö.
Eine solche Einigung ist weder nötig, noch sinnvoll.

jolo hat offensichtlich den ursprünglichen geposteten Code mit einem bestimmten Code für die spezielle Anforderung 32 Bit-Zahlen auf 68000 zu formatieren verglichen und ist zu dem (durchaus richtigen) Schluss gekommen, dass ihm nur geringfügige Teile dazu fehlen, und dabei übersehen, dass diese Anforderung weder genannt, noch von dem ursprünglichen Code erfüllt wurde.

Außerdem hat er offenbar deutlich seltener auf AGSzabo's bisherige Anfragen ist diesem Forum geantwortet und deshalb noch nicht die Lust am Vorkauen verloren.

Vielleicht kann er ja jetzt vielleicht doch erkennen, warum alle vor ihm postenden den ursprünglichen code als ineffizient und unsinnig abgestempelt haben und warum keiner Lust zum Lösungen vorkauen hatte.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

11.08.2009, 07:42 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

"nur aus spass and er freue zu diskutieren" ist nicht richtig. ich brauche (für mein hobby) die lösung schon. rawdofmt geht, aber jetzt benutze ich wiederum die funktion von jolo! (und habe ihn in meinem readme creditiert)

ps: ich versteh nicht wieso das hier ein austausch-forum ist, aber viel fragen als unanständig gillt...

pps: "vor allem auf grafikkarten" stimmt auch nicht. ich habe sogar ein config-flag "4 color mode", bei dem nach einem schema die 4 ersten pens in die uebrigen gemappt werden (zB tabspen = backpen).

--
Sam os4.1, e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 11.08.2009 um 08:10 Uhr geändert. ]

[ Dieser Beitrag wurde von AGSzabo am 11.08.2009 um 08:16 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

11.08.2009, 21:54 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
ps: ich versteh nicht wieso das hier ein austausch-forum ist, aber viel fragen als unanständig gillt...

Fragen stellen und Fehler in Assemblercode suchen lassen sind zwei völlig verschiedene Dinge. Außerdem stellst Du alle naselang Fragen, die an Deiner Behauptung, Du würdest die Dokumentation lesen, Zweifel aufkommen lassen.
Außerdem gilt auch für Programmierfragen, dass man vom Fragesteller erwartet, vernünftige Informationen zum Problem herauszurücken, statt die anderen raten zu lassen.
Wir wissen immer noch nicht, warum wir nun einen Fehler in dem von Dir geposteten Assemblercode suchen sollten, den Du noch nicht einmal selbst geschrieben hast, obwohl ein einfacher Aufruf von RawDoFmt, oder jede andere Lösung, die den nicht funktionierenden Code ersetzt hätte, es auch getan hätte.
Oder warum Du nicht selbst versucht hast, eine entsprechende Funktion zu schreiben.
Zitat:
pps: "vor allem auf grafikkarten" stimmt auch nicht. ich habe sogar ein config-flag "4 color mode", bei dem nach einem schema die 4 ersten pens in die uebrigen gemappt werden (zB tabspen = backpen).
Und warum sollen wir das erraten?
Ist es zu viel verlangt, zu schreiben, dass der Code selbst noch auf einem A500 laufen können soll?
Wieso kannst Du das nicht einmal auf Nachfrage schreiben?

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

11.08.2009, 22:03 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

Entschuldige meine Dummheit ich tue was ich kann. Ich bin kein "grosser coder" und habe selber jede menge bugs. Trotzdem glaue ich, dass die Community hier funktionieren kann.

Und ja, es soll sogar auf a500 (mit 3.1 soft oder hard rom) laufen. Hat mich keiner gefragt und jeden Aspekt meines projekts zu nenne ist mehr als mir bewusst ist! Du Musst nix raten, blos mich fragen.

danke für deine hinweise
--
Sam os4.1, e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ - Antworten - Zitieren - Direktlink - ]

14.08.2009, 15:20 Uhr

jolo
Posts: 110
Nutzer
@Holger

Zitat:
Die ursprüngliche Routine habe ich durchaus verstanden. Allerdings werden dort nirgendwo Divisionen eingespart. Divisionen einzusparen wurde erst von Dir vorgeschlagen.

Hier missverstehen wir uns. In der ursprünglichen Version werden Divisionen durch Subtraktionen ersetzt.
Ich gebe zu, dass dies nicht ganz offensichtlich ist. Dennoch, die schon optimierte und ursprüngliche Version sah so aus:

code:
.2	addq.w	#1,d4
	sub.w	d3,d0
	bpl.s	.2
	add.w	d3,d0
	divu.w	#10,d3
	add.w	#$30,d4


und wurde als Ersatz gewählt für:

code:
.2	divu.w	d3,d0	; d3 = 10000, 1000, 100, 10, 1
	move.w	d0,d4	; Wert retten (Quotient)
	clr.w	d0	; Untere 16 Bits löschen (keine Hausnummern)
	swap	d0	; Restwert (Remainder) in untere 16 Bits
	divu.w	#10,d3	; 10000 zu 1000 usw.
	add.w	#$30,d4	; ASCII


Demnach hat der Autor langsame Divisionen vermieden.

"divu Dx,Dx" kostete eine 68000er 126 Taktzyklen, falls ich das noch recht in Erinnerung habe.
Selbst eine 68060 braucht noch deren 22, 68020/68030 46 Taktzyklen und eine 68040 28 Taktzyklen. Alle Angaben ohne Gewähr.
Wie schon mal angesprochen, mein letztes Assembler-Projekt liegt Jahre zurück...
Falls meine Angaben aber annähernd richtig sind, würde selbst eine 68060 den so optimierten Code oft genug schneller ausführen als irgendeinen, der auf Divisionen fußen würde, denn jede Subtraktion kostet eine 68060 gerade einmal einen Taktzyklus, macht summa summarum maximal 10 Taktzyklen pro Durchlauf und nicht 22. Im besten Fall sogar nur einen Taktzyklus.

code:
Timing Beispiel für 68000er Code unter Verwendung einer 68060
CPU:
.2	addq.w	#1,d4	; 1 Taktzyklus
	sub.w	d3,d0	; 1 Taktzyklus
	bpl.s	.2	; 7, 1 oder 0 Taktzyklen
			-----
			Variiert von 2 bis 9 Taktzyklen je Durchgang

Unter Umständen benötigen die 3 Instruktionen pro Durchgang nur
einen einzigen Taktzyklus. Das lassen wir mal außen vor.
					
Nehmen wir an dass die Branch-Vorhersage beim ersten Mal versagt
(7 Taktzyklen), ab dem zweiten Durchlauf klappt (0 Taktzyklen)
und beim letzten Durchlauf einen einzigen Taktzyklus benötigt so
ergibt sich folgender Wert für die ASCII-Ziffer 9:

1.  Durchgang  9
2.  Durchgang  2
3.  Durchgang  2
4.  Durchgang  2
5.  Durchgang  2
6.  Durchgang  2
7.  Durchgang  2
8.  Durchgang  2
9.  Durchgang  2
10. Durchgang  3
              ---
	      28 Taktzyklen

Für die ASCII-Ziffer 0 wird aber nur einen Durchgang benötigt,
also 9 Taktzyklen.

Demnach variieren die Ausführungszeiten stark je nach der Zahl,
die in D0 übergeben wird.
Der schlechteste Fall wäre 99999, d.h. 140 Taktzyklen, der beste
Fall wäre 0 mit 45 Taktzyklen.

Unter Verwendung der Division sieht dies wie folgt für eine
68060 CPU aus:
.2	divu.w	d3,d0	; 22 Taktzyklen
	clr.w	d0	; 1 Taktzyklus
	swap	d0	; 1 Taktzyklus
			-----
			24 Taktzyklen

Demnach sind es immer 120 Taktzyklen, egal welcher Wert in D0
steht.

Anbei, bei Verwendung einer Langwort-Division
divul.l dx,dx:dx  (44 Taktzyklen/68060)
liegt der Vorteil klar auf Seiten der Subtraktionsmethode.


Bei der 680x0 Assembler-Programmierung sollte der Programmierer einen ungefähren Überblick über die verschwendeten (?) Taktzyklen haben, ansonsten kann man sehr schön in 680x0 langsameren Code schreiben als der, der von irgendeinem Compiler generiert wird (hier im Thread wurde schon darauf hingewiesen).

Nachteilig bei einem Multitasking Betriebssystem ist, dass die Abarbeitung des betreffenden Codes zu jederzeit unterbrochen werden kann was uns dann unter Umständen einen Strich durch die sorgsam gemachte Rechnung macht.
Also ist das was ich oben aufgeführt habe nur Theorie die auch bestimmten Annahmen macht, z.B. dass die Branch-Vohersage beim erstenmal versagt (7 Taktzyklen, könnte ja auch gelingen...), ab dem zweiten Durchlauf klappt (0 Taktzyklen) und beim letzten Durchlauf einen Taktzyklus benötigt. Müsste das Kapitel im 68060 User Guide nachschlagen um mich wieder fit zu machen... Hab' dazu allerdings keine Lust.


Zitat:
Die Lösung, die Du gepostet hast, ist durchaus sinnvoll, wenn es darum geht, auf einem 68000, also nicht 68020+, eine 32 Bit Zahl zu formatieren.

Ich denke, dass der jetzt vorhandene Code, welcher die Subtraktionsmethode mittels einer Langwort-Tabelle durchführt, einen guten Kompromiss für alle MC680x0 Prozessoren darstellt. Siehe Taktzyklen-Auflistung oben - falls die von mir genannten Anzahlen an Taktzyklen annähernd stimmen, wovon ich allerdings ausgehe.


Zitat:
Parat haben und jemandem vorkauen, der alle paar Tage mit einer neuen Frage dieser Art kommt, sind zwei verschiedene paar Schuhe.

Ich sehe das Ganze etwas gelassener als Du. Wenn ich keine Lust habe auf Fragen einzugehen, werde ich mir auch nicht die Mühe machen, darauf zu antworten. Zudem ist gerade die Amiga-Programmierung recht schwierig weil es keine ausreichende, geschweige denn deutsche Dokumentation gibt. Für diejenigen, die seit mehr als 20 Jahren hin und wieder für das Amiga-OS programmieren, erscheint alles irgendwie logisch und ineinandergreifend. Für andere, die erst sehr viel später dazu gekommen sind gibt es aber viel zu viele Fragezeichen die auch nicht mittels der bestehenden Dokumentation aufgelöst werden können. Und die Zeiten als man alles selber bis ins kleinste Detail ausprobiert hat, d.h. disassemblieren bis zum Abwinken und dann eigene Test-Codes schreiben, sollten passé sein. Jetzt gibt es das bequeme Internet und Foren in denen man Fragen stellen kann und auch soll.


Zitat:
jolo hat offensichtlich den ursprünglichen geposteten Code mit einem bestimmten Code für die spezielle Anforderung 32 Bit-Zahlen auf 68000 zu formatieren verglichen und ist zu dem (durchaus richtigen) Schluss gekommen, dass ihm nur geringfügige Teile dazu fehlen, und dabei übersehen, dass diese Anforderung weder genannt, noch von dem ursprünglichen Code erfüllt wurde.

Die Fragestellung war ob der betreffende, noch nicht modifizierte Code für Langworte angepasst werden könnte (Zahlen größer 99999).

Zitat:
...auf langwortgröße sollte es schon funtionieren. wer weis wie?

Dies habe ich in Form des 68020(+) leicht geänderten Code-Snippets gepostet und als Anmerkung eine Alternative für 68000er genannt. Demnach ist meinem Erachten nach die Fragestellung befriedigend beantwortet worden.


@AGSzabo

Zitat:
aber jetzt benutze ich wiederum die funktion von jolo! (und habe ihn in meinem readme creditiert)

Das ist zwar ein netter Zug von Dir aber gar nicht nötig weil ich nicht der Autor der von Dir beschriebenen Routine bin.
Zum anderen würde ich persönlich nur Menschen erwähnen, die einen wirklichen Beitrag zu einem Projekt geleistet hätten.
Würde Dein Projekt ohne meine Anmerkungen nicht laufen? Siehst Du. Demnach kannst Du mich getrost aus Deinen Credits löschen.


Grüße

[ - Antworten - Zitieren - Direktlink - ]

14.08.2009, 15:36 Uhr

AGSzabo
Posts: 1663
Nutzer
@jolo:

Ob du die routine selbst schreibst oder mir anders beschaffst ist mir eigentlich egal (das kann man ja auch extra mit angeben). Selbstverstälich halte ich mich an die wünsche der helfer ob jemand genannt werden will oder nicht. die sind leider nicht immer eindeutig. zuviel ist imo bsser also zu wenig. man soll sehen wieviele leute ein projekt interessiert. ich mumbele herum ob ich xui open source machen soll, aber auf jeden fall zu "contrib-ware" wo man ne funktion oder etas zum projekt beisteuern kann wenn man es mag.

ps: ich komme zum teil aus der demoscene, da sind umfassende credits und greetings eine regel. :)

--
Sam os4.1, e-uae 39bb2 - A4000d 39bb2 - Cyberst.MK3 060 50mhz 128mb - Cybervis. - Ariadne_II - ide DVD und 320gb HD (nur 128gb) - HD Floppy -- A500 3.1 adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 14.08.2009 um 15:46 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

14.08.2009, 17:25 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von jolo:
Hier missverstehen wir uns. In der ursprünglichen Version werden Divisionen durch Subtraktionen ersetzt.
Ich gebe zu, dass dies nicht ganz offensichtlich ist. Dennoch, die schon optimierte und ursprüngliche Version sah so aus:

Ja, das ist es, was eben auf Unverständnis stieß. Es gibt einen naheliegenden Algorithmus, der so schon im Schulunterricht beschrieben wird (falls Dezimalkonvertierung überhaupt ein Thema ist), und vor allem, auf den eigentlich jeder selbst kommen kann.

Der besteht einfach darin, so lange durch zehn zu dividieren, bis man null erhält und den jeweiligen Rest von rechts nach links hinzuschreiben. Insbesondere, wenn man in Assembler programmiert, wo man Quotient und Rest in einer Operation bekommt, sehr kompakt.

Die Anzahl der Divisionen ist gleich der Anzahl sichtbarer Stellen, wenn man den Algorithmus etwas umformt, auch eine weniger.

Wenn man dies im Hinterkopf hat, kommt man kaum darauf, dass ein Algorithmus, der im Schnitt mehr Divisionen durchführt, Divisionen einsparen würde.

Gegenüber dieser Variante gab es zwei mögliche Alternativen, um die ursprüngliche Fragestellung zu beantworten. Entweder man ersetzt diesen durch einen anderen Code, wie z.B. den Standardalgorithmus, von dem man hoffen kann, dass der Fragesteller ihn versteht, der aber den Nachteil hat, nicht auf 68000 zu funktionieren. Oder man versucht, eine 68000-kompatible Lösung zu finden. Da gibt es bestimmt auch noch mehr als Deine.
Zitat:
Nehmen wir an dass die Branch-Vorhersage beim ersten Mal versagt
(7 Taktzyklen), ab dem zweiten Durchlauf klappt (0 Taktzyklen)
und beim letzten Durchlauf einen einzigen Taktzyklus benötigt so
ergibt sich folgender Wert für die ASCII-Ziffer 9:
...
28 Taktzyklen

Für die ASCII-Ziffer 0 wird aber nur einen Durchgang benötigt,
also 9 Taktzyklen.

Demnach variieren die Ausführungszeiten stark je nach der Zahl,
die in D0 übergeben wird.
Der schlechteste Fall wäre 99999, d.h. 140 Taktzyklen, der beste
Fall wäre 0 mit 45 Taktzyklen.

Unter Verwendung der Division sieht dies wie folgt für eine
68060 CPU aus:
.2 divu.w d3,d0 ; 22 Taktzyklen
clr.w d0 ; 1 Taktzyklus
swap d0 ; 1 Taktzyklus
-----
24 Taktzyklen

Demnach sind es immer 120 Taktzyklen, egal welcher Wert in D0
steht.

Moment, Du vergleichst Deine Variante mit dem ursprünglichen Code. Und gehst offenbar von 16 Bit aus.

Der Algorithmus, der von mir und Thore gepostet wurde, iteriert nur über die sichtbaren Stellen, benötigt also nur eine Division pro sichtbarer Stelle.

Ist also sehr wohl von der zu formatierenden Zahl abhängig.

Wenn wir von 32-Bit-Formatierung ausgehen, benötigt die Formatierung der Zahl "0" nach dem simplen Algorihtmus lediglich eine Division, (die man auch noch wegoptimieren kann), d.h. nach Deinen Angaben 44 Taktzyklen für Long-Division, während der andere Algorithmus über alle Stellen iteriert also so lange braucht, wie von Dir für Ascii-Ziffer 0 angegeben, also 9 Zyklen, auch wenn nichts geschrieben wird. Macht bei zehn Stellen 90 Zyklen.

Also ist der einfache Algorithmus bei kleinen Zahlen, die meiner Meinung nach häufiger vorkommen, effizienter. Bei großen Zahlen kippt das zwar, aber Du hast ja auch den restlichen Overhead unter den Tisch fallen lassen. Der einfachere Algorithmus kommt z.B. ohne zusätzlichen Test auf "0" aus.

Vor allem aber habe ich ja von Anfang an betont, dass da nichts optimiert ist und auch Vorschläge zur Optimierung gemacht. Einer war z.B. zwei Stellen auf einmal zu verarbeiten. Eine Division durch 100 würde gegenüber dem worst case der Subtraktionsmethode, also 18 Iterationen für "99", deutlich besser aussehen. Und man könnte beim Erreichen von fünfstelligen Zahlen auf 16Bit-Divisionen wechseln oder den Trick mit dem Ersetzen von Divisionen durch Multiplikationen einsetzen.

Wenn es um Performanceoptimierung geht, gibt es noch wesentlich mehr Potential. Viele Iterationen sind selten die optimale Lösung.
Zitat:
Nachteilig bei einem Multitasking Betriebssystem ist, dass die Abarbeitung des betreffenden Codes zu jederzeit unterbrochen werden kann was uns dann unter Umständen einen Strich durch die sorgsam gemachte Rechnung macht.
Das Risiko hat jeder Code. Aber natürlich verringert sich das Risiko, je weniger Taktzyklen man braucht. Deine Rechnung bleibt also relevant.
Zitat:
Also ist das was ich oben aufgeführt habe nur Theorie die auch bestimmten Annahmen macht, z.B. dass die Branch-Vohersage beim erstenmal versagt (7 Taktzyklen, könnte ja auch gelingen...), ab dem zweiten Durchlauf klappt (0 Taktzyklen) und beim letzten Durchlauf einen Taktzyklus benötigt.
Bei Schleifen, bzw. Rückwärtssprüngen gilt normalerweise die Annahme, dass sie stattfinden, die Vorhersage versagt dann nur beim letzte Mal, und auch dass nur, wenn die CPU keine weitere Heuristiken besitzt.
Wie's beim 68060 konkret aussieht, weiß ich nicht. Halte ich auch nicht für so wichtig, weil die Performance auf den älteren Rechnern wichtiger wäre.
Zitat:
Ich denke, dass der jetzt vorhandene Code, welcher die Subtraktionsmethode mittels einer Langwort-Tabelle durchführt, einen guten Kompromiss für alle MC680x0 Prozessoren darstellt.
Mir erscheint er auch als guter Kompromiss. Aber ich bin sicher, dass es noch deutlich effizienter gehen würde, wenn man das wollte.
Zitat:
Ich sehe das Ganze etwas gelassener als Du. Wenn ich keine Lust habe auf Fragen einzugehen, werde ich mir auch nicht die Mühe machen, darauf zu antworten.
Ähem, hier wurde geantwortet, weil man antworten wollte.

Es sah nur so aus (sieht eigentlich immer noch so aus), als hätte hier jemand einen Code, den er selber nicht versteht, gepostet, um sich jetzt eine Variante zum Benutzen einzuholen, die er immer noch nicht versteht, ohne jegliches Interesse daran zu haben, es wirklich zu verstehen.

Ich glaube, die meisten hier dachten, wenn jemand in Assembler programmiert, hat er auch Interesse daran, das Ganze auch zu verstehen. Deshalb wurde gefragt, warum der Code so aussieht, und versucht, den Fragesteller in eine Richtung zu lenken, die ihn selbst in die Lage versetzt, besseren Code zu schreiben.

Daran bestand offensichtlich kein Interesse. Aber genau das lässt alles so sinnlos erscheinen.
Zitat:
Und die Zeiten als man alles selber bis ins kleinste Detail ausprobiert hat, d.h. disassemblieren bis zum Abwinken und dann eigene Test-Codes schreiben, sollten passé sein. Jetzt gibt es das bequeme Internet und Foren in denen man Fragen stellen kann und auch soll.
Ja, aber wenn wir schon code für andere schreiben, warum müssen wir dann ausgerechnet eine weitere überflüssige GUI-Bibliothek programmieren?

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

16.08.2009, 14:40 Uhr

Holger
Posts: 8116
Nutzer
Just for fun...

Hier eine optimierte Fassung der "Dividiere durch zehn, bis null erreicht ist"-Variante:

code:
;
	; d0 - unsigned 32 Bit value
	; a0 - target buffer (up to 11 bytes required)
	; restores all registers
_itoa
	movem.l	d0-d6/a1/a2,-(a7)
	lea	.sizes(pc),a1
.getSize
	addq.l	#1,a0
	cmp.l	(a1)+,d0
	bhi.s	.getSize

	moveq.l	#1,d3
	moveq.l #100,d4
	swap	d3	; 65536

	clr.b	(a0)	; zero terminated (C-style)

	cmp.l	d3,d0
	bcs.s	.skipBigLoop

	lea	.oneDigits(pc),a1
	lea	.tenDigits(pc),a2
.bigLoop
	divul.l d4,d1:d0
	move.b	(a1,d1.w),-(a0)
	move.b	(a2,d1.w),-(a0)
	cmp.l	d3,d0
	bhi.s	.bigLoop
.skipBigLoop

	move.l	#52429,d3	; 1/10 ~
	moveq.l	#19,d4	; 52429/2^19
	moveq.l	#"0",d6
.smallLoop
	move.l	d0,d5
	mulu.l	d3,d0
	lsr.l	d4,d0	; d0/=10
	move.l	d0,d1
	move.l	d0,d2
	lsl.l	#3,d1
	add.l	d2,d2
	add.l	d2,d1	; d1=d0*10
	sub.l	d1,d5	; d5-=d1 => 0..9
	or.b	d6,d5	; d5|="0"
	move.b	d5,-(a0)
	tst.l	d0
	bne.s	.smallLoop

	movem.l	(a7)+,d0-d6/a1/a2	; a0 has same value as before
	rts

.tenDigits
	dc.b	"00000000001111111111222222222233333333334444444444"
	dc.b	"55555555556666666666777777777788888888889999999999"

.oneDigits
	dc.b	"01234567890123456789012345678901234567890123456789"
	dc.b	"01234567890123456789012345678901234567890123456789"

.sizes
	dc.l	9, 99, 999, 9999, 99999, 999999, 9999999
	dc.l	99999999, 999999999, 4294967295


Wie gehabt, benötigt die Routine um so weniger Taktzyklen, je kleiner die zu formatierende Zahl ist, genauer, je weniger sichtbare Stellen sie hat. Der worst case liegt jetzt aber bei insgesamt drei Divisionen, für Zahlen kleiner als 65536 werden gar keine Divisionen mehr benötigt.

Die benötigten Zyklen pro Stelle liegen deutlich unter dem worst-case der Subtraktionsmethode, je nach CPU sogar unter dem best case.

Nun ja, für 68020 oder höher.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]


1 -2- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > value to dezimal string [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.