Wie kann ich die Ausgabe von 250500 * 250500 in 32-Bit-Worten darstellen?

403
Wino Paz

Wir haben 250500 * 250500 = 62.570.250.000. Wie können wir dies mit low und high darstellen? Ich weiß, dass die größte Zahl, die in 32 Bit dargestellt werden kann, 4.294.967.295 (2 ^ 32 - 1) ist.

-3
-1 Diese Frage "Wie können wir diese Zahl mit niedrigen und hohen Werten darstellen?" Ist Kauderwelsch. Die Zahl, die Sie angeben, ist übrigens die größte Zahl, wenn Sie keine negativen Zahlen speichern. barlop vor 7 Jahren 1
Mit niedrig und hoch meinen Sie binär, wobei niedrig 0 und hoch 1 ist. barlop vor 7 Jahren 0
Die Anzahl, die Sie zu speichern versuchen, ist 62 Milliarden, wobei Sie selbst sagten, dass Sie in 32 Bit maximal 4 Milliarden speichern können. Alles, woran ich denken kann, ist vielleicht Exponent und Mantisse - binäre wissenschaftliche Notation. barlop vor 7 Jahren 2
Wenn Sie den Windows-Rechner überprüfen, sehen Sie, dass das Binärzeichen für diese 62-Milliarden-Zahl "11101001 11000011 01001101 01000001 0000" lautet. Dies sind 32 Bits + 4 Bits am Ende, bei denen es sich um Nullen handelt. Wenn Sie also die ersten 32 Bits an einer Stelle speichern und an der anderen Stelle speichern Sie etwas, das sagt, multiplizieren Sie dies mit 2 ^ 4, dann arbeiten Sie mit dem cud. Möglicherweise ist das ein Exponent von 4. Aber Sie brauchen noch ein paar Bits für den Exponenten. Mindestens 3 Bits Du benutzt einen Exponenten. Ich kann nicht sehen, wie Sie diese Zahl in nur 32 Bits speichern können. Möglicherweise 35 oder 36 Bits. Vielleicht in zwei 32-Bit-Wörtern, wenn dies zulässig ist barlop vor 7 Jahren 1
Warum beschränken Sie sich künstlich auf nur 32 Bit? Ramhound vor 7 Jahren 2
@barlop: "Ich kann nicht sehen" ... nicht nur Sie. (Ich bin der Typ, der Ihren Kommentar gewählt hat.) Feste Grenzen der Mathematik bestimmen, dass Sie recht haben. Das "Taubenloch-Prinzip", das häufig darüber diskutiert wird, was mit der Datenkomprimierbarkeit möglich ist, weist darauf hin, dass es einige Grenzen gibt, die wir nicht einfach "umgehen können", nur weil das wahrgenommene Ergebnis so scheint, als wäre es schön. TOOGAM vor 7 Jahren 0
@ TOOGAM Nun, ich nehme an, es gibt sogar Interpretationen, selbst wenn die binären Zahlen regelmäßig gespeichert werden, z. B., dass es sich um eine Zahl handelt ... oder dass die Zahl> 0 sein muss. Es könnte also ein Schema für das Speichern von Zahlen kommen, das 1 Bit erfordert. 0 = keine Nummer gespeichert 1 = seine 62 Milliarden, egal welche Zahl! Oder ein Schema, das einen kleineren Zahlenbereich speichert, aber einen Bereich, der ihn enthält. Ich kann einfach nicht sehen, dass er auch über ein solches Schema spricht ;-) (aber es würde nicht gegen 'solide Mathematik' gehen, wenn er das täte!) Deshalb habe ich nicht gesagt, dass es unmöglich ist. barlop vor 7 Jahren 0

2 Antworten auf die Frage

2
TOOGAM

Im Binärformat sieht 250500 * 250500 = 62.570.250.000 wie folgt aus:
0011 1101 0010 1000 0100 * 0011 1101 0010 1000 0100 =
0110 1001 1100 0011 0100 1101 0100 0001 0000

Feste mathematische Regeln besagen, dass Sie die Ergebnisse einer 18-Bit-Zahl mal einer 18-Bit-Zahl in 36 Bit einpassen können. Feste Regeln des mathematischen Zustands, die Sie nicht unbedingt durch Komprimierung reduzieren können, daher müssen Sie einige Einschränkungen beachten.

Es kann jedoch einige Optionen geben.

Mit einem Computer können Sie Meter oder Kilometer verfolgen.
Wenn Sie das Konzept von 50 Kilometern nachverfolgt haben, ist dies tatsächlich das Gleiche wie das Nachhalten von 50.000 Metern.
Anstatt 250500 * 250500 = 62.570.250.000 (dh 250.500 Einzeleinheiten x 250.500 Einzeleinheiten) im Auge zu behalten, können Sie auch Deza-Einheiten nachverfolgen, z. B. 25050x25050 = 627.502.500 (250.500 Dekaunits x 250.500 Deza-Einheiten = 627.502.500 Quadrat-Dekaden) -Einheiten). Die Zahl 627.502.500 passt in ein 32-Bit-Wort.

Ein erfahrener Computerprogrammierer sollte überlegen, was der Arbeitsspeicher des Computers darstellt (z. B. wenn ein Speicher Informationen über Einheiten oder Dezaeinheiten speichert), und es sollte in Betracht gezogen werden, Anpassungen vorzunehmen, wenn es Vorteile gibt (z. B. Umgehen von Einschränkungen oder möglicherweise nur das Arbeiten mit) schnellere Geschwindigkeit).

Vielleicht möchten Sie, anstatt Deza-Einheiten zu verfolgen (Gruppen von 10 Einheiten), Gruppen von Einheiten mit einer anderen Größe verfolgen, z. B. Gruppen von 500 Einheiten. Das Konzept besagt, dass Sie, wenn Sie wissen, dass Ihre Zahlen immer gerade sein werden, Zahlen durch zwei und potenzielle mit kleineren Einheiten teilen können. (Obwohl Sie sich durch mehr als 2 teilen müssen, um den spezifischen Maximalwert von 4.294.967.295 zu unterschreiten.) Wenn Sie Hekto-Einheiten (je 100 Einheiten) verfolgen können, hätten Sie statt 250.500 * 250.500 2.505 * 2.505 = 6.275.025 (12 Bit mal 12 Bit, was 24 Bit erfordern kann, um ein Ergebnis zu speichern, erfordert jedoch für diesen speziellen Fall nur 23 Bit). Wenn Sie die Quinque Hekto-Einheiten (500) nachverfolgen können, haben Sie 501 * 501 = 251.001 (9 Bit mal 9 Bit, in 18 Bit gespeichert).

Ob Sie ein nützliches Muster finden können, ist ein Aspekt nützlicher Programmierung, der über die reine Kenntnis einer Programmiersprache hinausgeht. Wenn Sie dies tun, hängt dies oft davon ab, welches Konzept der realen Welt Sie verfolgen möchten, und die Realisierbarkeit (und Details der Implementierung) können zwischen den verschiedenen Szenarien der Praxis variieren.

Edit: Kleinere Korrektur. Außerdem wurde der Absatz um 500 Einheiten erweitert, um die tatsächlichen Zahlen als Demonstration anzuzeigen.

0
TOOGAM

Die Frage lautet derzeit: "Wir haben 250500 * 250500 = 62.570.250.000."

Nun, das ist komplett und totaler Blödsinn.
250500 * 250500 = 62.570.250.000. (FALSCHE MATH in der Frage angegeben)
250500 * 250500 = 62.750.250.000. (RECHTE MATH, was die Frage wahrscheinlich bedeutete, um zu fragen)

Dies warf einige meiner Berechnungen ab. Wenn wir von einem Tippfehler ausgehen und diesen korrigieren, kann ich diese Antwort für 62.750.250.000 zur Verfügung stellen.

Die einfache und unkomplizierte Antwort auf die Frage lautet: Speichern einer kleineren Zahl zusammen mit einer Potenz. Das ist die Antwort, zusammengefasst in wenigen Wörtern. Diese Antwort erfordert wahrscheinlich eine Erklärung, weshalb ich den Rest dieses Textes gebe.

25.500 sind 18 Bits.
2 ist ein Bit.
Das erfordert insgesamt 19 Bits. Das sind 32 Bit. Das funktioniert.

Tatsächlich ist diese Denkweise derjenigen einer x86-CPU (80387 und neuer) ähnlich, die Fließkommazahlen verfolgt und einige Bits als Signifikanz verwendet .

In der Frage wurde nicht angegeben, dass 62.570.250.000 als direkte Nummer gespeichert werden müssen. Als erstes können Sie versuchen, es mit einem Quadrat zu verwurzeln und zu sehen, ob das Ergebnis eine Ganzzahl ist. Das Ergebnis ist eine ganze Zahl. Daher ist eine perfekt gültige Lösung verfügbar. Diese Lösung erlaubt erfolgreich das Speichern einiger Zahlen von bis zu 549.755.748.352 (was 8.388.607 * 65.536, auch 8.388.607 * (zwei bis zur 16. Potenz angehoben) entspricht). Eine der Zahlen, die dieses System genau wiedergeben kann, ist
62.750.250.500
, obwohl dieses System nicht in der Lage wäre,
62.750.250.499 zu speichern

Das ist in Ordnung, denn für die Frage mussten nicht alle möglichen kleineren Zahlen gespeichert werden. Die Frage wollte einfach einen Weg, um die Zahl 62.750.250.500 darzustellen. Das ist durchaus machbar.

Die gespeicherten Bits sind also:
0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0

Bei Verwendung einer Technik, die der üblichen IEEE-Gleitkomma-Baugruppe ähnelt, können diese Bits folgendermaßen interpretiert werden:

  • eine positive Zahl (erstes Bit)
  • 25500 (Bits 10 bis 32)
  • das wird einmal mit sich selbst multipliziert
    • Weil ... "1" der Wert der Bits 2 bis 9 ist.

Beachten Sie, dass die Bits 2 bis 8 und 10 bis 14 führende Nullen sind. Das sind 7 + 5 = 12 Bits, die in diesem Fall nicht sehr effektiv sind. Wenn positive Zahlen angenommen werden, sind dies 13 Bits, die für diesen speziellen Fall ein bisschen unwirksam / ineffizient sein können. Es besteht daher die Möglichkeit, dass diese unterschiedlich verwendet werden. (Erinnern Sie sich, dass ich früher sagte, dass wir 19 der 32 Bits benötigen. 13 + 19 = 32.)

Die Idee hier ist, dass "Ausgabe" nicht als große Zahl gespeichert werden muss, wenn Sie wissen, dass diese Zahl leicht als Zweierpotenz dargestellt werden kann. Der Wert von 62.750.250.000 wird effektiv gespeichert, und die Art und Weise, wie er dargestellt wird, ist die Speicherung einer kleineren Zahl zusammen mit einer Leistung . Im Wesentlichen speichern wir Daten, die in Kombination mit einer von uns angegebenen bekannten Formel die Speicherung dieser bestimmten Zahl ermöglichen. (Diese Formel kann sinnvoll sein, um andere Zahlen zu speichern, in einer Situation, in der die Benutzer häufig mit quadratischen Zahlen arbeiten.)

Hinweis: Dieses System ähnelt sich etwas, ist aber NICHT das gleiche wie das von IEEE beschriebene Floating-Point-System, das ich in einer auf x86-Assembly fokussierten University Assembly-Klasse gesehen habe. Hier ist ein Hyperlink zu einem Online-Konverter für IEEE-Gleitkommazahlendie Sie für dieses System verwenden könnten. In diesem System geben die Bits für den Exponenten an, mit welcher Potenz von 2 die verbleibenden Bits multipliziert werden. Das passt jedoch nicht in diesen Fall, da 25.500 keine Zweierpotenz sind. Beim Versuch, das Gleitkommasystem nach IEEE zu verwenden, konnten wir feststellen, dass 62.750.250.000, dividiert durch 16, 3.921.890.625 sind. Wir könnten also die Zahl als 3.921.890.625 mal darstellen (zwei zur vierten Potenz). Dennoch würden wir 36 Bit benötigen, was größer ist als die 32 Bit, nach denen gefragt wird (und größer als die 24 Bit, die Intels Coprozessoren zum Speichern der Nicht-Exponentenversion der Zahl verwenden).

Ich könnte den Teil der Frage "Verwenden von Niedrig und Hoch" weitgehend ignoriert haben. Mir war nicht ganz klar, was die Frage gerade ist. Dieses System verwendet jedoch unterschiedliche Bits für verschiedene Zwecke, und so kann der Exponentenabschnitt der Daten als "höhere" Bits betrachtet werden als die anderen Bits, die an einer niedrigeren Position angeordnet sind. Die Frage "Wie können wir das darstellen?" Wird also direkt durch den mutigen Satz beantwortet und mit dem Rest dieser Antwort weiter erläutert.