 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
psygate
Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
|
Verfasst am: 18.07.2006, 12:52 Titel: Diskussion über swap a,b und Co. (*grins*) |
|
|
Tja, ich habe mi gedacht, dass es ganz nützlich wäre einmal die Tricks und Kniffe der FreeBasic Community zu sammeln. Ich möchte hier alle btite einen Trick oder mehr hinein zu schreiben. Ich fang mal an mit etwas ganz banalem:
Code: |
'swap a,b ist langsamer als:
asm
x=x xor y
y=y xor x
x=x xor y
end asm
|
_________________ Danke an Volta für seine großartige MMX_fade function. *verneig*
Personal-DNA:
<script src="http://personaldna.com/h/?k=qtrCFboSuCOpFrX-OI-AADBA-f78d&t=Free-Wheeling+Leader">
</script>
Zitat: | Das Forum für den zum QBASIC kompatieblen open soure FreeBasic Kompiler. | by DJ. Peters
Zuletzt bearbeitet von psygate am 24.07.2006, 12:17, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 18.07.2006, 15:51 Titel: |
|
|
So ähnlich hab ich das doch schon mal gesehen
http://www.freebasic.net/forum/viewtopic.php?t=4875
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
psygate
Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
|
Verfasst am: 19.07.2006, 23:16 Titel: |
|
|
Jap, habs gesucht aber nicht gefunden.
@M. Frey: Ja, aber da stehen nur Codes drinnen, aber nicht solche kleinen tricks. Dieses x=x cor y ist nämlich viel schneller als swap. Solche kleinen 'Speed-Ups' findet man auf fb@rchiv einfach nicht. _________________ Danke an Volta für seine großartige MMX_fade function. *verneig*
Personal-DNA:
<script src="http://personaldna.com/h/?k=qtrCFboSuCOpFrX-OI-AADBA-f78d&t=Free-Wheeling+Leader">
</script>
Zitat: | Das Forum für den zum QBASIC kompatieblen open soure FreeBasic Kompiler. | by DJ. Peters |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
|
Nach oben |
|
 |
psygate
Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
|
Verfasst am: 20.07.2006, 12:11 Titel: |
|
|
Wenn wir hier weiter so diskutieren, dann gar nciht.
Aber ich hab da noch was:
auch wenn komplizierter aus sieht, aber es geht auch:
Code: |
x=3
y=4
print x or y
print not(not(x) and not(y))
print x and y
print not(not(x) or not(y))
print x xor y
print not(x) and y or x and not(y)
sleep
|
Naja, is jetzt nciht wirklich ein trick, sollte aber vielleicht ein bisschen helfen die arbeit der logischen operatoren zu verstehen.
Und, nachdem FreeBASIC anscheinend nicht fähig ist mit double werten (3.1415xxxxxxxx) eine mod operation auszuführen, kann man als subroutine ja diese version einbauen:
x mod y=x-int(x/y)*y
[/code] _________________ Danke an Volta für seine großartige MMX_fade function. *verneig*
Personal-DNA:
<script src="http://personaldna.com/h/?k=qtrCFboSuCOpFrX-OI-AADBA-f78d&t=Free-Wheeling+Leader">
</script>
Zitat: | Das Forum für den zum QBASIC kompatieblen open soure FreeBasic Kompiler. | by DJ. Peters |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 20.07.2006, 14:02 Titel: |
|
|
Das ist kein 'Fehler' von FreeBASIC!
Mod ist eine Funktion für Integerzahlen:
Das englische Wiki hat Folgendes geschrieben: | Description:
Mod is the modulus or "remainder" arthimetic operator. The result of Mod is the integer remainder of number1 divided by number2. If either number1 or number2 is not an integer value then it is rounded to the nearest whole number. | Ein solcher Hinweis fehlt in der deutschen Hilfe.
[Edit]
Eine ausführliche Beschreibung des Befehles Mod ist hier
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 21.07.2006, 13:23 Titel: Re: Tricks und Kniffe |
|
|
psygate hat Folgendes geschrieben: | Tja, ich habe mi gedacht, dass es ganz nützlich wäre einmal die Tricks und Kniffe der FreeBasic Community zu sammeln. Ich möchte hier alle btite einen Trick oder mehr hinein zu schreiben. Ich fang mal an mit etwas ganz banalem:
Code: |
'swap a,b ist langsamer als:
asm
x=x xor y
y=y xor x
x=x xor y
end asm
|
|
Der Vorschlag für so eine Rubrik ist ja nicht schlecht.
Aber wenn man solch einen Beitrag vorher nicht mal ausprobiert...
1. zwischen asm ... end asm funktionieren keine normalen Basicanweisungen
2. swap a, b ist schneller als die 3 Basicanweisungen
Code: | option explicit
#include once "windows.bi"
const _COUNTER_LOOP_COUNT_ = 1000
dim shared as ulongint _counter_tsc1_, _counter_tsc2_
dim shared as ulongint _counter_overhead_, counter_cycles
dim shared as uint _counter_loop_counter_
sub _counter_code1_
asm
xor eax, eax
cpuid
rdtsc
mov [_counter_tsc1_], eax
mov [_counter_tsc1_+4], edx
end asm
end sub
sub _counter_code2_
asm
xor eax, eax
cpuid
rdtsc
mov [_counter_tsc2_], eax
mov [_counter_tsc2_+4], edx
end asm
end sub
#define COUNTER_BEGIN _
_counter_overhead_ = 2000000000 :_
counter_cycles = 2000000000 :_
SetPriorityClass( GetCurrentProcess(), HIGH_PRIORITY_CLASS ) :_
for _counter_loop_counter_ = 1 to _COUNTER_LOOP_COUNT_ :_
_counter_code1_ :_
_counter_code2_ :_
if (_counter_tsc2_ - _counter_tsc1_) < _counter_overhead_ then :_
_counter_overhead_ = _counter_tsc2_ - _counter_tsc1_ :_
endif :_
next :_
for _counter_loop_counter_ = 1 to _COUNTER_LOOP_COUNT_ :_
_counter_code1_
'
' *** Note the open FOR loop ***
'
#define COUNTER_END _
_counter_code2_ :_
if (_counter_tsc2_ - _counter_tsc1_) < counter_cycles then :_
counter_cycles = _counter_tsc2_ - _counter_tsc1_ :_
endif :_
next :_
SetPriorityClass( GetCurrentProcess(), NORMAL_PRIORITY_CLASS ) :_
counter_cycles -= _counter_overhead_
dim as integer x,y,z
x=5:y=-233
counter_begin
swap x,y
counter_end
print "swap x,y : ";counter_cycles;" CPU - Takte"
x=5:y=-233
counter_begin
z=x :x=y :y=z
counter_end
print "z=x :x=y :y=z : ";counter_cycles;" CPU - Takte"
x=5:y=-233
counter_begin
x=x xor y: y=y xor x: x=x xor y
counter_end
print "x=x xor y: y=y xor x: x=x xor y : ";counter_cycles;" CPU - Takte"
Sleep
|
Quelle Testprogramm:
http://www.freebasic.net/forum/viewtopic.php?p=34325#34325
Gruß Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 23.07.2006, 12:06 Titel: |
|
|
Hi,
Diese 'Tricks' funktionieren aber nur mit Integers..
(und auch nur durch Veränderung der beteiligten Variablen, was mir gegen den Strich geht!)
Swap kann aber mehr.. Code: | 'Ä=Ž , Ö=™ , Ü=š ; ä=„ , ö=”, ü=? , ß=á ,§=õ , ©=¸
Option Escape
Option Explicit
Const Pi=4.0*Atn(1.0), Rho=50.0/Atn(1.0)
Dim As Double a=Pi, b=Rho
Dim As Long c=19, d=4
?"Swapz.Bas ¸2006 by ytwinky, MD"
?"a=" &a &" b=" & b
?"Swap a, b"
Swap a, b
?"a=" &a &" b=" & b
?"c=" &c &" d=" & d
?"Swap c, d"
Swap c, d
?"c=" &c &" d=" & d
?"a=" &a &" d=" & d
?"Swap a, d"
Swap a, d
?"a=" &a &" d=" & d
?"\nDaá das letzte Beispiel verkehrt ist, weiá ich.."
?"Warum der fbc das nicht weiá, weiá ich nicht ;-))"
?"(auch wenn 64 schon ziemlich nah an 63,6619.. dran ist,"
?"bleibt 19 relativ weit von 0 entfernt..)"
?"a=" &a &" d=" & d
?"Swap d, a"
Swap d, a
?"a=" &a &" d=" & d
?"Ooops, gerundet.."
?"voltas Tipp eingef?gt(auch).."
?"Eniki..";
Sleep | ..nämlich ohne Klimmzüge Doubles oder Integers vertauschen.
(Double und Integer vertauschen klappt nicht ohne Probleme, wie das Beispiel zeigt..
Hmm, eine Typ-Prüfung würde die Funktion stark verlangsamen, wenn sie in langen
Schleifen(Sortieren) verwendet wird..
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO..
Zuletzt bearbeitet von ytwinky am 23.07.2006, 15:31, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 23.07.2006, 13:54 Titel: |
|
|
Hi ytwinky,
ich hab deinen Test mal ergänzt mit:
Code: | ?
?"Swap d, a"
Swap d, a
?"a=" & a &" d=" & d | also mal den letzten Tausch 'rückgängig' gemacht.
Code: | Swapz.Bas ¸2006 by ytwinky, MD
a=3.141592653589793 b=63.66197723675813
Swap a, b
a=63.66197723675813 b=3.141592653589793
c=19 d=4
Swap c, d
c=4 d=19
a=63.66197723675813 d=19
Swap a, d
a=9.387247270983684e-323 d=64
Swap d, a
a=64 d=19
Daá das letzte Beispiel verkehrt ist, weiá ich..
Warum der fbc das nicht weiá, weiá ich nicht ;-))
Eniki.. | Das ist das Ergebnis.
Vermutlich wird die 32bit-Integer nur bitweise in die 64bit -Double kopiert, nicht konvertiert. Das zurück kopieren funktioniert dann auch.
Gruß Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 23.07.2006, 14:11 Titel: |
|
|
Wie einige vllt wissen, sammle ich solche Routinen für meine commonstatements.bi (Siehe auch Projektvorstellungen), eine Include, die eine ganze reihe nützlicher Codefragmente, DEFINEs and so on enthält. Hat jemand etwas dagegen, wenn die im rahmen dieser Diskussion entstehenden Procs an die BI anfüge?
Ich hatte vor, die File in nächster Zeit auf stefan.freebasic.de zu veröffentlichen.
Have a nice day
Ciao
Stefan _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 23.07.2006, 15:37 Titel: |
|
|
Hi Dusky_Joe,
nö, ich hab nix dagegen..
..reicht eigenlich noch eine CD im die BI-Datei zu brennen oder muß es schon eine DVD sein
(dann müßte ich ernstlich die Anschaffung eines DVD-Brenners erwägen,
oder, wie gewisse andere Herren auch, die Liga der Analog/ISDN-Nutzer verlassen..)
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 23.07.2006, 18:03 Titel: |
|
|
Nein! Nicht du auch noch!
(Man verzeihe mir weiters noch den OT... ) _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 23.07.2006, 18:38 Titel: |
|
|
Hey, ruhig Brauner, der Kutscher kennt den Weg..
Anlog/ISDN-Liga rulez
Analoge Grüße
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
psygate
Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
|
Verfasst am: 24.07.2006, 11:07 Titel: |
|
|
So. Ejtzt habt ihr geschafft.
jetzt musss ich ncoh was dazu schreiben:
swap a,b kann amn auch durch
ersetzen. Das ist jetzt mein letzter beitrag für heute. Achja, könnte nicht ein Mod diesen Thread in "Diskussion über Swap a,b" umbenennen? Wäredoch treffender  _________________ Danke an Volta für seine großartige MMX_fade function. *verneig*
Personal-DNA:
<script src="http://personaldna.com/h/?k=qtrCFboSuCOpFrX-OI-AADBA-f78d&t=Free-Wheeling+Leader">
</script>
Zitat: | Das Forum für den zum QBASIC kompatieblen open soure FreeBasic Kompiler. | by DJ. Peters |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 24.07.2006, 11:38 Titel: |
|
|
Dazu brauch's keinen Mod und keinen Admin - kannst du leicht selber machen. Editiere einfach deinen ersten Beitrag (den Eröffnungsbeitrag) und gib' als Titel was anderes an.
Übrigens: interessanter Lösungsweg.
@ytwinky:
Aufdass uns die analoge (ich fass ISDN, auch wenn's nicht korrekt ist mal mit dazu ) Welt noch lange erhalten bleibe.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 25.07.2006, 11:20 Titel: |
|
|
Hi psygate,
schön das du jetzt geschrieben hast 'swap a,b kann man auch durch .. ersetzen'
Ist richtig, .. aber warum sollte man das machen?
Ich würd auch nicht alle Subtraktionen Code: | x= 100 : y= 54
?x + 1 + not y | so ersetzen
Gruß Volta
@Dusky_Joe, auch ich hab nix dagegen.. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
psygate
Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
|
Verfasst am: 25.07.2006, 13:15 Titel: |
|
|
@Dusky: Auch wenn cih nciht erwarte, dass du was von meinen willst, aber gerne
@Volta:
Mann... Langsam glaube ich immer weniger, dass du ein Mensch bist...
Sag mal, hat man dich mit Computerbauteilen oder so gefüttert, als du noch ein Kind warst? Das ist ein fast unglaubliches WIssen, welches du da besitzt...
Aber frage am rande: Wird das nicht prozessor-intern so abgehnandelt mit
1 + not y ? Ich meine irgendwo mal gelesen zu haben ,dass ein Proz eh nicht Subtrahieren kann? _________________ Danke an Volta für seine großartige MMX_fade function. *verneig*
Personal-DNA:
<script src="http://personaldna.com/h/?k=qtrCFboSuCOpFrX-OI-AADBA-f78d&t=Free-Wheeling+Leader">
</script>
Zitat: | Das Forum für den zum QBASIC kompatieblen open soure FreeBasic Kompiler. | by DJ. Peters |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 25.07.2006, 13:28 Titel: |
|
|
psygate hat Folgendes geschrieben: | Aber frage am rande: Wird das nicht prozessor-intern so abgehnandelt mit
1 + not y ? Ich meine irgendwo mal gelesen zu haben ,dass ein Proz eh nicht Subtrahieren kann? |
Du liegst nicht weit daneben:
http://de.wikipedia.org/wiki/Zweierkomplement
Zum Titelthema: Wir können sonst die Swap-Operation mathematisch einmal beweisen. Dazu schreibe ich sie leicht um:
a1=a0+b0
b1=a1-b0
a2=a1-b1
Behauptung: a2=b0, b1=a0
Beweis durch Substitution und anschliessendem Vereinfachen:
a2=a1-b1=(a0+b0)-(a1-b0)=(a0+b0)-((a0+b0)-b0) = a0+b0-(a0+b0-b0)=a0+b0-a0=b0
b1=a1-b0=(a0+b0)-b0=a0+b0-b0=a0
Vermutlich operationenmässig spart man keine Zeit, dagegen jedoch Speicherplatz, weil keine Temp-Variable nötig ist. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 25.07.2006, 14:15 Titel: |
|
|
Hi,
ich bin ganz menschlich (obwohl meine Azubis manchmal auch das Gegenteil behaupten ).
Ganz normal an der Mutterbrust groß geworden, da es noch keine Computer gab mit deren Teilen man mich füttern konnte.
Ich hab nur die letzten 40 Jahre sehr viele Erfahrungen sammeln können.
dreael hat deine Fragen schon beantwortet.
Obwohl (entschuldige @dreael) solche mathematischen Beweise hab ich immer gehasst (ich war immer zu faul diese Dinger nachzuvollziehen).
Gruß Volta
Edit/
@dreael,
der Tausch von Variableninhalten ist operationstechnisch einfacher und in wenigen CPU-Takten erledigt als 3 Rechenoperationen. Der Test in dem Beitrag oben zeigt das auch.
Edit2/
dumm gelaufen, habe das gerade auf einem Celeron 2,93GHz nachgeprüft und siehe da: genau anders.
Swap braucht mehr Taktzyklen als die 3 Rechenoperationen!! _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|