Autor Beitrag
NetSpider
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Do 08.02.07 06:01 
Hi Leute,

also, mir ist mal vor kurzem was aufgefallen:

Nehmen wir eine Zahl (ist jetzt einfach gehalten, damit ichs schoen leicht erklaeren kann), z.B. 3740.

Diese Zahl soll durch 5 geteilt werden - wie rechnet ihr? Bitte jetzt nicht sagen "Mit Taschenrechner... Probierts mal im Kopf.

Ich habs so gemacht: (3740 / 10) * 2 -> das ist meine Rechenreihenfolge.
Ergebnis 3740 / 10 = 374; 374 * 2 = 748
Ist doch gar nicht so schwer gewesen, obwohl es viel schwerer ist, wenn man direkt 3740/5 teilt.

Und jetzt soll ein Computer das ausrechnen. Ich glaube nicht, dass der Computer meine Rechenschritte ausfuehrt. Er wird direkt 3740 / 5 ausfuehren. Gut, man kann jetzt auch das menschliche Gehirn nicht direkt mit einem Computer vergleichen (Computer = stur, Gehirn = interpretationsfaehig + viel mehr), aber kann es auch sein, dass sich der Computer mit meinen zwei Rechenschritten leichter tun wuerde, als mit seinem einen Rechenschritt?
Gut, das Beispiel ist jetzt viel zu einfach, aber nehmen wir mal eine hoch-komplexe Rechnung - die leicht in mehrere kleine (einfache) Rechnungen umgebaut werden kann, die wir Menschen im Kopf rechnen koennten.

Kann der Computer kleinere, leichtere Rechnungen schneller loesen, als eine Kompliziertere (ist alles vom Menschenauge betrachtet, vielleicht ist es dem Computer auch egal, ob das jetzt fuer uns kompliziert ist oder nicht)?
Wass wuerdet ihr fuer Messergebnisse erwarten?

Ich hab echt keine Ahnung... :shock:

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Do 08.02.07 07:47 
Ich vermute einfach mal, dass für den PC alles gleich schwer ist.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Do 08.02.07 08:13 
wenn du mit einer hochkomplexen Rechnung was meinst wie (vereinfacht) (123+45*10^23)/65-109
dann kann ich dir gleich mal sagen, dass das ja vom Computer nicht einem SChritt ausgerechnet wird, (in Delphi) schon vom Compiler zerlegt wird in seine Bestandteile, also 10^23 und so weiter, so dass immer nur 2 Operanden bei einer Operation drin sind...
Und ich glaube so einen Schritt macht der Computer immer in einem Takt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.02.07 09:57 
Naja, x^y nicht gerade in einem Schritt. ;-)
Aber was die vier Grundrechenarten angeht: Dafür gibt es jeweils einen Assemblerbefehl, fertig.
Da gibts ADD, SUB, MUL und DIV...

Dem Computer ist das vollkommen egal, wie "schwer" eine Rechnung für uns ist. Man muss sehen, dass möglichst wenige Assembler-Operationen notwendig sind, aber das ist auch alles (neben anderen kleineren Optimierungen). Eine Rechnung in der Art aufzuteilen macht für den Computer keinen Sinn.
Zumindest fällt mir nichts ein, wo das in der Art, wie du es geschrieben hast, Sinn machen würde, auch nicht bei komplizierteren Rechnungen.
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 08.02.07 10:31 
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 08.02.07 11:02 
In diesem Zusammenhang hab ich kürzlich ein schöne Aussage gefunden:
aus Knuth, Morris, Pratt: Fast pattern matching in strings, 1977:
It is a curious fact that people often think the new algorithm will be slower than the naive one, even though it does less work. Since the new algorithm is conceptually hard to understand at first, by comparison with other algorithms of the same length, we feel somehow that a computer will have conceptual difficulties too - we expect the machine to run more slowly when it gets to such subtle instructions.
Einem Computer ist es egal, was er rechnet. Es ist da nur wichig, wie oft er "Strom an - Strom aus" machen muss :D.

_________________
We are, we were and will not be.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 08.02.07 23:30 
Naja, ein Beispiel, wo der Computer mit Zerlegen der Aufgabe schneller rechnet:

ausblenden Delphi-Quelltext
1:
2:
Var A: Array of Extended;
A[X] := 1;


In ASM steht da dann meist sowas wie:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
asm
    MOV     EBX, OFFSET [A]
    FLD1
    MOV     EAX, DWORD PTR [X]
    LEA     EAX, DWORD PTR [EAX+4*EAX]
    FSTP    TBYTE PTR [EBX+2*EAX]
end;


Jetzt werden sich sicherlich hier einige fragen, warum da nicht MUL für die Offset-Berechnung genommen wird: Weil MUL auf der Arithmetik-Unit läuft, LEA auf der Adress-Unit ... Und die Adress-Unit ist meist weniger ausgelastet als die ALU :P

Folgender Code geht also auch ... Bremst aber in den meisten Fällen ...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
asm
    FLD1
    MOV     EBX, DWORD PTR [X]
    MUL     EBX, 10
    ADD     EBX, OFFSET [A]
    FSTP    TBYTE PTR [EBX]
end;


Gute Compiler denken nicht umständlich, sondern effizient ... Eine Funktion, die dem DCC32 noch fehlt ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
SyntaxError
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 30



BeitragVerfasst: Sa 10.02.07 12:52 
Naja, auch ein Computer rechnet nicht direkt xxxx / xx sondern vergleicht alles Binär mit 0 und 1.

Auch gibt es dort in Wirklichkeit keine Multiplikation und Division, sondern nur Addition und Subtraktion.

Beispiel:

10:2

Hier zieht der Computer so lange die 2 von 10 ab, bis nix mehr übrig bleibt und addiert die Versuche und kommt in der Schleife auf 5 erfolgreiche Versuche.

Umgekehrt 10*2

Hier addiert der Computer 10 mal die 2 hintereinander, er addiert also die 2 10 mal in ner Schleife und präsentiert die Summe ....

Das Ganze jetzt noch aus dem Dezimalsystem ins Binärsystem und fertig ist die Mathematikwurst.

Bei komplexen/zeitintensiven Aufgaben verwendet man oft auch Tabellen, bei denen schon Ergebnise gespeichert sind.

_________________
Gruß SyntaxError
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 10.02.07 13:04 
user profile iconSyntaxError hat folgendes geschrieben:
Auch gibt es dort in Wirklichkeit keine Multiplikation und Division, sondern nur Addition und Subtraktion.

Beispiel:

10:2

Hier zieht der Computer so lange die 2 von 10 ab, bis nix mehr übrig bleibt und addiert die Versuche und kommt in der Schleife auf 5 erfolgreiche Versuche.

Anderes Beispiel: 4,36 und 0,11323... und jetzt?
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 10.02.07 13:11 
user profile iconSyntaxError hat folgendes geschrieben:
Beispiel:

10:2

Hier zieht der Computer so lange die 2 von 10 ab, bis nix mehr übrig bleibt und addiert die Versuche und kommt in der Schleife auf 5 erfolgreiche Versuche.


Ich bin zwar kein Experte, was die internen Vorgänge angeht, aber das halte ich dann doch für Unsinn. Ich denke doch, dass Operationen wie shl und shr so in den Architekturen verankert sind, dass eine Division/Multiplikation durch/mit 2 etwas zügiger als dieser Schleifenkram geht ;-).

Und bei anderen Zahlen wird das ähnlich gehen - im Wesentlichen so, wie man die schriftliche Division/Multiplikation in der Schule lernt. Nur übertragen aufs Binärsystem. Ich glaube kaum, dass eine Operation 1.000.000 x 1.000.000 durch 1 Million Additionen durchgeführt wird.

_________________
We are, we were and will not be.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 10.02.07 13:21 
user profile iconGausi hat folgendes geschrieben:
Ich bin zwar kein Experte, was die internen Vorgänge angeht, aber das halte ich dann doch für Unsinn. Ich denke doch, dass Operationen wie shl und shr so in den Architekturen verankert sind, dass eine Division/Multiplikation durch/mit 2 etwas zügiger als dieser Schleifenkram geht ;-).

Gehts ja auch, und ich könnte da auch noch einiges mehr dazu sagen, aber ich wollte es erstmal bei dem Beispiel bewenden lassen...
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Sa 10.02.07 13:22 
wenn du dir solche fragen stellst, dürfte das hier für dich auch nicht uninteressant sein

www.delphi-library.d...iewtopic.php?t=67926

nur stelle ich mir gerade die frage, woher weiß der pc, wie man addiert ? ich mein, was passiert beim addieren zweier zahlen auf der cpu ? wie werden die daten zusammengeworfen, sodass da ein ergebnis bei rauskommt ?

mfg
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 10.02.07 13:33 
Ich überlege gerade ob ich nachher einen seeehr langen Beitrag schreiben soll oder lieber etwas Zeit mit Google verbringen sollte und dann Links posten sollte... ;-)
Vielleicht wiederhole ich ja auch die Einführung in die Funktionsweise einer CPU, die ich via Internet vor einem halben Jahr gemacht habe, bzw. poste Sachen daraus ^^
Firzen
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 17

WIN XP
Delphi 2006
BeitragVerfasst: Sa 10.02.07 13:57 
user profile iconGausi hat folgendes geschrieben:


Ich bin zwar kein Experte, was die internen Vorgänge angeht, aber das halte ich dann doch für Unsinn. Ich denke doch, dass Operationen wie shl und shr so in den Architekturen verankert sind, dass eine Division/Multiplikation durch/mit 2 etwas zügiger als dieser Schleifenkram geht ;-).

Und bei anderen Zahlen wird das ähnlich gehen - im Wesentlichen so, wie man die schriftliche Division/Multiplikation in der Schule lernt. Nur übertragen aufs Binärsystem. Ich glaube kaum, dass eine Operation 1.000.000 x 1.000.000 durch 1 Million Additionen durchgeführt wird.


Auf der Schaltkreisebene besitzt die ALU nur Addierer. Mit ihnen kann man addieren und subtrahieren (Das liegt am verwendeten Dualzahlensystem). Wie schon gesagt, wird multiplizieren und dividieren nur emuliert und es gibt dafür keine seperate Einheit. Die ALU (auf Programmier-Technischer Ebene) hingegen kennt mehrere Befehle, z.B. Addieren, subtrahieren, multiplizieren, dividieren, vergleichen, um n Stellen verschieben und noch ein paar mehr. Wie jetzt das um "n Stellen verschieben" realisiert wird, weiß ich jetzt nicht so genau, aber bei Hexdezimalzahlen müsste das durch simples anhängen von Nullen funktionieren.

Zu der anderen Frage:
Man hat einen kleinen Schaltkreis erfunden, der in der Lage ist, solche Signale (O und 1) zu addieren (Das geht durch UND und ODER Elekrobausteine). Nennt sich auch Volladdierer. Bei Wiki gibt es ein gutes Bild von dem Schaltkreis:
upload.wikimedia.org..._Aufbau_DIN40900.svg

Edit: Sry, jetzt hab ich ganz vergessen, das Volladdierer Bild etwas genauer zu erläutern:
(Zum Verständnis müsste es reichen, wenn ich die Eingänge und Ausgänge nenne)
x: Eingang 1
y: Eingang 2
cIN: Das ist der Eingang für einen Übertrag, falls in einer vorherigen Rechnung einer entstanden ist
s: Ausgang
cOUT: Falls ein Übertrag entsteht, ist dieser Ausgang 1 und falls nicht bleibt er Null
Das Ergebnis setzt sich also aus zwei Werten zusammen: Aus der Ergebnis der Addition und dem dadurch (vllt) enstandenen Übertrag

Das kann man natürlich noch weiter ausführen, aber ich denke mal, dass das für einen kleinen Einblick reicht ;-)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 10.02.07 14:18 
Ich hab jetzt nur ganz schnell drübergeschaut, aber ich denke der Link passt...
www.inf.fh-flensburg...erial/serialmul2.htm
SyntaxError
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 30



BeitragVerfasst: Sa 10.02.07 14:35 
user profile iconjaenicke hat folgendes geschrieben:
user profile iconSyntaxError hat folgendes geschrieben:
Auch gibt es dort in Wirklichkeit keine Multiplikation und Division, sondern nur Addition und Subtraktion.

Beispiel:

10:2

Hier zieht der Computer so lange die 2 von 10 ab, bis nix mehr übrig bleibt und addiert die Versuche und kommt in der Schleife auf 5 erfolgreiche Versuche.

Anderes Beispiel: 4,36 und 0,11323... und jetzt?


Das Komma macht keinen Unterschied, egal ob Ganzzahlen oder nicht, das Grundprinzip ist immer das gleiche: 0er und 1er, mehr geht nicht, das ist alleine schon durch den Zustand bestimmt, das Transistoren nur 2 Zustände kennen, nämlich an oder aus. Zahlen, die nicht aus Ganzzahlen bestehen, werden eben zerlegt.

Es gibt zwar Einheiten in der CPU, die scheinbar multiplizieren und dividieren, so wie es ja auch Befehle dafür gibt aber "untendrunter" wird alles auf Transistorebene addiert und subtrahiert.

Und aus was bestehen CPUs, RAM und das ganze andere Gedöns ?? Richtig, aus Transistoren, die nur 0 und 1 kennen ....

_________________
Gruß SyntaxError
SyntaxError
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 30



BeitragVerfasst: Sa 10.02.07 14:41 
user profile iconjaenicke hat folgendes geschrieben:
Ich hab jetzt nur ganz schnell drübergeschaut, aber ich denke der Link passt...
www.inf.fh-flensburg...erial/serialmul2.htm


Aus Deinem Link:

Zitat:
Multiplikations­algorithmus
Für die Multiplikation zweier n-Bit-Zahlen an-1, ..., a0 und bn-1, ..., b0 müssen die in Bild 1a für n = 4 angegebenen Bit-Produkte gebildet und stellenrichtig addiert werden.


Nichts anderes ist simple Mathematik. Wenn Du auf einem Blatt Papier multiplizierst, machst Du nix anderes alls "stellenrichtig addieren" .... ;):D

Beim Dividieren ist es genauso: Du zählst die Anzahl der Möglichkeiten zusammen, wie oft eine kleinere Zahl in eine größere passt und dieses "zählen" ist nix anderes wie ne Addition einzelner Möglichkeiten, die nachher eben das Ergebnis präsentiert.

Das wurde einem aber schon in der Grundschule beigebracht .... :D:D

_________________
Gruß SyntaxError
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 10.02.07 14:55 
Ja, klar... Aber eben nicht in einer Schleife, wo die Anzahl der Schleifendurchläufe das Ergebnis ist!
Mit dem Beispiel wollte ich nur fragen, wie du dir das mit dem "in einer Schleife addieren" dann vorstellst. (Denn zunächst klang deine Darstellung etwas... naja sagen wir komisch. ;-))

So wie du es jetzt gesagt hast, hört es sich ja so an, als wüsstest du doch wie es geht. :D
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 10.02.07 15:28 
Zum Thema Division nur soviel ...
Man shiftet so lang nach links, bis in einem zweiten Register ein Wert steht, der größer ist, als die Zahl, durch die geteilt werden soll. Ist das der Fall, wird mit 2 multipliziert und 1 addiert. Ist das nicht der Fall, wird das Ergebnis nur mit 2 multipliziert ...
So hat man 32 Durchläufe (Registerbreite) und nahezu 0 Zusatzspeicher benötigt ... Ich hab das mit der Division mal für Int32/Int32 auf Z80 (8-Bit)-Assembler gesehen ... Eine Routine 1,5 Bildschirmseiten, aber es ging ... Was die CPU nicht kann, wird wenn's benötigt wird mit Software nachgebaut ... Und alles, was in Software realisierbar ist, kann man auch einer Hardware beibringen ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
SyntaxError
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 30



BeitragVerfasst: Sa 10.02.07 15:31 
Naja, evtl. habe ich mich ja auch etwas "einfach" ausgedrückt. Wobei bei einer Division würde das schon passen ....

Beispiel:

X:Y=Z

Zähler=1
Start:
Wenn Y in X passt, bleibt dann ein Rest ??
Wenn ja, Y von Z abziehen, Zähler um 1 erhöhen => zurück zum Start
Wenn nein => Ende und Zähler ausgeben

Im Beispiel von 10:2 würde die Schleife 5x durchlaufen und somit als Ergebnis 5 präsentieren.

_________________
Gruß SyntaxError