Autor |
Beitrag |
NetSpider
      
Beiträge: 123
Windows XP Pro
Delphi 7 Enterprise
|
Verfasst: 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... 
_________________ Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: 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
      
Beiträge: 929
Erhaltene Danke: 1
Delphi 7 Professional
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
|
Verfasst: Do 08.02.07 10:31
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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  .
_________________ We are, we were and will not be.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 08.02.07 23:30
Naja, ein Beispiel, wo der Computer mit Zerlegen der Aufgabe schneller rechnet:
Delphi-Quelltext 1: 2:
| Var A: Array of Extended; A[X] := 1; |
In ASM steht da dann meist sowas wie:
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
Folgender Code geht also auch ... Bremst aber in den meisten Fällen ...
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
      
Beiträge: 30
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 10.02.07 13:04
SyntaxError 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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Sa 10.02.07 13:11
SyntaxError 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 10.02.07 13:21
Gausi 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
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 17
WIN XP
Delphi 2006
|
Verfasst: Sa 10.02.07 13:57
Gausi 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 30
|
Verfasst: Sa 10.02.07 14:35
jaenicke hat folgendes geschrieben: | SyntaxError 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
      
Beiträge: 30
|
Verfasst: Sa 10.02.07 14:41
Aus Deinem Link:
Zitat: | Multiplikationsalgorithmus
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" .... 
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 ....  
_________________ Gruß SyntaxError
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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. 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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
      
Beiträge: 30
|
Verfasst: 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
|
|
|