Angesichts Doppel x. Und unter der Annahme, daß sie in 0,1 liegt. Nehmen wir an, dass x0.3 In binär, (halten 10 Ziffern nach dem Dezimalpunkt), es wird dargestellt, wie ich einige C-Code, der die 10 Ziffern nach dem Dezimaltrennzeichen zu extrahieren schreibt. Mit anderen Worten, ich möchte die Ganzzahl zu extrahieren (0100110011) 2. Nun bin ich ganz neu für Bit Shifting und die (naive) Lösung, die ich für das Problem haben, ist die folgende Dann temp in binary wird die necesary 10 Ziffern haben. Ist dies ein sicherer Weg, um die oben genannten Prozess ODER gibt es sicherere / mehr richtige Möglichkeiten, dies zu tun Hinweis. Ich möchte nicht, dass die Ziffern in Form eines Zeichenarrays extrahiert werden. Ich möchte speziell eine Ganzzahl (OR unsigned Integer) für diese. Der Grund dafür ist, dass in Generation von Oktaven, Punkte im Raum Hash-Schlüssel auf ihre Position als Morton Keys genannt gegeben werden. Diese Schlüssel werden in der Regel als Ganzzahlen gespeichert. Nach dem Erhalten der integrierten Schlüssel für alle Punkte werden sie dann sortiert. Theoretisch können diese Tasten durch Skalierung der Koordinaten auf 0,1, Extrahieren der Bits erhalten werden. Und verschachtelt sie. Sie haben zwei verschiedene Konvertierungsroutinen für die Umwandlung der Integer und Bruchteile in binäre. Sie verstehen, wie zu konvertieren 1864 in binäre, aber Sie haben Probleme bei der Umwandlung .78 in binäre. Hinweis: Sie müssen die tatsächliche Fraktion in den Speicher für den Schwimmer 1864.78, die 1864.780029 oder Fraktion 0.780029 nicht 0,78 ist, enthalten. Das scheint, wo Ihre Rundung Verwirrung kommt aus. Um einen Bruch in seine Binärdarstellung umzuwandeln, multiplizieren Sie den Bruch mit 2 und wenn die resultierende Zahl einen ganzzahligen Teil größer als 1 hat. Ihre Binärdarstellung dieses Bits ist 1. Wenn nicht Ihre Darstellung 0 ist. Wenn größer als eine, Subtrahieren Sie 1 von der Zahl und wiederholen, bis Sie die Nummer erschöpft haben oder die Grenze der Genauigkeit erreicht haben. Zum Beispiel: Hinweis: wie der Gleitkomma-Bruchwert eher zu Null anstatt zu Ihrem Zifferngrenze neigen wird. Wenn Sie versuchen, 0.78 zu konvertieren (was nicht exakt dargestellt werden kann als der Bruch auf 1864.78 in einem 32-Bit-Gleitkommawert), erhalten Sie eine andere Umwandlung im 12. Bit. Sobald Sie Ihre fraktionalen Teil in binäre konvertiert haben, können Sie mit der Umwandlung in IEEE-754 einzigen Genauigkeit Format fortsetzen. ZB: Die Normalisierung für den voreingenommenen Exponenten ist: Umwandlung in das verborgene Bitformat zu Mantissen: Dann verwenden Sie die Vorzeichen-Bitüberschuss-Mantisse, um die IEEE-754-Einzelpräzision darzustellen: Schauen Sie vorbei und lassen Sie mich wissen, wenn Sie weitere Fragen haben . Wenn Sie eine einfache Routine, um ein Zeichen-Array mit der resultierenden Konvertierung füllen wollte, könnten Sie etwas ähnliches wie die folgenden tun, um einen Gleitkomma-Bruchteil auf binäre zu konvertieren: Ich stimme zu. Der Punkt, den ich versuchte zu machen ist, dass, wenn Sie einfach versuchen, den Float-Wert von 0,78 in binär zu konvertieren, ohne Berücksichtigung der Wirkung der 32-Bit-Grenze für die Darstellung von .78, die von 1864.78 kommt, werden Sie mit einer anderen Binärdatei Repräsentation für den Bruchteil - der schien, wo die Verwirrung über Rundung stammte aus. Vielleicht hätte ich da ein bisschen klarer sein können. Ich habe das Missverständnis in Bezug auf 39 aufgerundet, denn jetzt haben wir 23 insgesamt Bits 39 ndash David C. Rankin 15 Februar, um 9:55 Dies ist wahrscheinlich die gründlichste Antwort, die man hoffen könnte und ich kann nicht meine Anerkennung genug ausdrücken. Sie fingen also den Teil, der mich verwirrte. Als ich mit der Methode, die Sie auf .78 anstelle der exakten Darstellung beschrieben wurde, ging ich weit über die Präzision hinaus und hatte keine Ahnung, was zu tun ist, sobald es vorbei ist. Also habe ich es gerade auf 1 gerundet und durch reines Glück erreicht die richtige 32-Bit-Darstellung. Auch auf diese Frage ist es offensichtlich, dass ich verwirrend einige Terminologie war. Meine einzige Frage an Sie ist jetzt, wie haben Sie die genaue Fraktion .780029 ab .78 ndash Kane Schutzman Das war der einfache Teil. Float fvalue 1864,78. Dann für den Bruchwert fv ist es float fv fvalue - (int) fvalue. Auf diese Weise haben Sie den genauen Teilteil, der mit 1864.78 in einem 32-Bit-Float gespeichert werden kann. Froh, dass ich helfen konnte. Das bedeutet nur an einem gewissen Punkt in der Vergangenheit, ich musste durch die Bits und Stücke der IEEE-754 Umwandlung zu kämpfen und I39m gerne, was ich gelernt passieren. Es ist eine große Übung für das Verständnis (gründlich), wie Schwimmer in Erinnerung behandelt werden. (Schmerzhaft, aber hilfreich :) ndash David C. Rankin KaneSchutzman, nicht bevor Sie fertig sind, kämpfen mit Ihrem Tauchen in IEEE-754, aber nachdem Sie den Kampf gekämpft haben, hat I39ve meine float IEEE-754 Single Präzisions-Binärdarstellung auf Pastebin. Ich denke, es ist auch auf SO, so dass ich don39t wollen, verdoppeln Post, aber ich kann es nicht finden, es in meiner Liste der Antworten zu finden. Oh gut - hoffe es hilft. Ndash David C. Rankin Youre 1 Bit zu kurz: das IEEE754 binary32-Format verwendet eine 24-Bit-Bedeutung, aber gespeichert mit 23 Bits mit einem impliziten führen 1. Also die letzten 2 Bits sind: die die Zahl gibt 1.11010010001100011110110 2 mal 2 10 Sie haben den voreingenommenen Exponenten bereits berechnet (137 10001001 2), so dass das resultierende Bitmuster direkt konstruiert werden kann: Diese Seite wird aus dem Original mit dem Google Übersetzer übersetzt. IEEE 754 - Standard binären arithmetischen Float Autor: Yashkardin Vladimirnbsp nbsp softelectro. ru nbsp nbsp 2009-2011 nbsp nbsp nbsp nbsp nbsp infosoftelectro. ru 1. Titel Standard. Diese Norm ist die Vereinigung IEEE (Institut für Elektro - und Elektronik-Ingenieure) und wird verwendet, um reelle Zahlen (Gleitkomma) im binären Code darzustellen. Der am meisten verwendete Standard für Gleitkomma, der von vielen Mikroprozessoren und Logikgeräten und Software verwendet wird. Titel der Norm in der internationalen elektrotechnischen Kommission IEC: IEC 60559: 1989, Binäre Gleitkommarithmetik für Mikroprozessorsysteme IEEE: IEEE-Standard für binäre Gleitkommaarithmetik (ANSI / IEEE Std 754-1985) (IEC 559: 1989 - die alte Bezeichnung der Norm) Im Jahr 2008 hat der Verein IEEE Standard IEEE 754-2008, die die Norm IEEE 754-1985 enthalten freigegeben. 2.Brief Beschreibung des Standards. Die ursprüngliche Ausgabe des Standards: IEEE Standard für binäre Gleitkomma-Arithmetik nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp Copyright 1985 durch das Institut der Elektrotechnik und Ingenieure, Inc 345 East 47th Street, New York, NY 10017, USA The Standard enthält 23 Textseiten in 7 Abschnitten und einen Anhang: 1.Scope 1.1 Implementierungsziele 1.2 Einschlüsse 1.3 Ausschlüsse 2.Definitionen 3.Formate 3.1 Wertebereiche 3.2 Grundformate 3.3 Erweiterte Formate 3.4 Kombinationen von Formaten 4.Rounding () 4.1 Round Auf die nächstgelegenen 4.2 gerichteten Rundungen 4.3 Rundungspräzision 5. Operationen 5.1 Arithmetik 5.2 Quadratwurzel 5.3 Floating-Point-Formatkonvertierungen 5.4 Konvertierung zwischen Gleitkomma und Integer-Formaten 5.5 Runde Gleitkommazahl bis Integer-Wert 5.6 Binäre Dezimal-Konvertierung 5.7 Vergleich 6.Infinity, NaNs und Signed Zero 6.1 Infinity Arithmetik 6.2 Operationen mit NaNs 6.3 Das Zeichen Bit 7.Ausnahmen 7.1 Ungültige Operation 7.2 Division durch Null 7.3 Overflow 7.4 Underflow 7.5 Inexact 8.Traps 8.1 Trap Handler 8.2 Vorhersage A. Empfohlene Funktionen und Prädikate nbsp nbsp nbspNein , Hat sich das IEEE von einer internationalen Organisation des öffentlichen Ingenieurwesens (die es ursprünglich war) einer Handelsorganisation entwickelt. Diese Organisation besitzt das Urheberrecht zur Veröffentlichung der Norm IEEE754-1985. Also, wenn Sie lesen möchten, mit dem ursprünglichen Standard, müssen Sie es für rund 80 zu kaufen. Das russische Recht erlaubt mir jedoch, die Lehre dieser Norm zu kommentieren. Daher geben die weiteren Ill eine willkürliche Darstellung der Norm und äußern ihre Meinung darüber zu Ausbildungszwecken. Standard IEEE 754-1985 bestimmt: werden als positive und negative Gleitkommazahlen normalisiert Wie die positiven und negativen denormalisierten Gleitkommazahlen darstellen Wie die Anzahl der Null darstellen Als ein besonderer Wert, um Infinity (Infiniti) darzustellen Wie eine spezielle darstellen Wert der No-Number (NaN oder NaNs) Vier Modi der Rundung IEEE 754-1985 definiert vier Format für Gleitkommazahlen: Einzelpräzision (Einzelpräzision) 32-Bit Doppeltpräzision (Doppelpräzision) 64-bit Mit Single Erweiterte Genauigkeit (Single-Extended-Präzision) 43 Bits (selten verwendet) Doppelte erweiterte Genauigkeit (double-extended precision) 79 Bits (typischerweise 80 Bit) 3. Grundbegriffe in der Darstellung von Gleitkommazahlen. 3.1 Einreichung einer normalisierten Exponentialform. Nehmen wir zum Beispiel die Dezimalzahl 155.625 Stellen Sie sich die Zahl in einer normalisierten exponentiellen Form vor: 1,55625872910 2 1,556258729exp 10 2 Zahl 1.556258729exp 10 2 besteht aus zwei Teilen: einer Mantisse M 1.55625 und dem Exponenten exp 10 2 Wenn die Mantisse im Bereich von 1 -2 liegt. 3.2 Einreichung einer denormalisierten Exponentialform. Nehmen Sie zum Beispiel die Dezimalzahl 155,625 Stellen Sie sich die Anzahl der denormalisierten exponentiellen Weg: 0,155625872910 3 0,1556258729exp 10 3 Nummer 0,1556258729exp 10 3 besteht aus zwei Teilen: eine Mantisse M 0,155625 und Exponent exp 10 3 Wenn die Mantisse im Bereich von 0,1 -3 liegt. 3.3 Umwandlung von Dezimalzahl in binäre Gleitkommazahl. Unser Problem wird auf eine dezimale Gleitpunktzahl in binärer Gleitkommazahl in exponentiell normalisierter Form reduziert. Dazu erweitern wir die angegebene Anzahl von Binärziffern: 155,625 187292 7 087292 6 087292 5 187292 4 187292 3 087292 2 187292 187292 0 187292 -1 087292 -2 187292 -3 155,625 128 0 0 16 8 0 2 1 0,5 0 0,125 155,625 10 10011011,101 2 - die Anzahl der Dezimal - und Binär-Gleitkommazahlen Die resultierende Zahl zur normierten Form im Dezimal - und Binärsystem: 1.556258729exp 10 2 1,00110111018729exp 2 111 Infolgedessen haben wir die Hauptkomponenten von Die normalisierte Exponentialzahl von Binärzahlen: Mantissa M1.0011011101 Exponent exp 2 111 4. Beschreibung Umwandlungszahlen von IEEE 754. 4.1 Die Transformation einer normalisierten Binärzahlen im 32-Bit-Format IEEE 754 Die Hauptanwendung in den Technologie - und Programmierformaten waren 32 und 64 Bits. Zum Beispiel in VB unter Verwendung der Datentypen Single (32 Bit) und Double (64 Bit). Betrachten Sie die Transformation der Binärzahl 10011011.101 Format Einzelfertigung (32 Bit) IEEE Standard 754. Andere Formate der Zahlen in IEEE 754 ist eine vergrößerte Kopie der Einzelpräzision. Um die Nummer im Format IEEE 754 einzuplanen, sollte die IEEE 754 auf die binär normierte Form gebracht werden. In 3 haben wir diese Umwandlung auf die Zahl 155.625 gemacht. Betrachten Sie nun, wie eine normalisierte Binärzahl in ein 32-Bit-Format umgewandelt wird IEEE 754 Beschreibung der Transformation im 32-Bit-Format IEEE 754: Zahl kann oder sein. Daher spielen Sie ein bisschen, um das Vorzeichen zu kennzeichnen: 0-positiv 1-negativ Diese höchstwertige Bit-zu-32-Bit-Sequenz. Dann gehen Exponentbits, diese weist 1 Byte (8 Bits) zu. Aussteller kann, wie die Nummer, mit dem Zeichen oder -. Um das Vorzeichen des Exponenten zu ermitteln, um kein weiteres Zeichenbit einzufügen, fügen Sie den Offset zum Exponenten im Halbbyte 127 (0111 1111) hinzu. Das heißt, wenn unsere Ausstellung 7 (111 in binär), dann verschoben Exponenten 7 127 134. Und wenn unsere Aussteller -7 war, dann Offset Booths 127-7 120. Biased Exponent wird in den zugeteilten 8 Bits geschrieben. Wenn wir jedoch eine exponentielle Binärzahl erhalten müssen, subtrahieren wir einfach 127 von diesem Byte. Die restlichen 23 Bits für die Mantisse. Jedoch ist das normalisierte binäre Mantissen-erste Bit immer 1, da sich die Zahl im Bereich 1 befindet. Die Tabelle zeigt die Dezimalzahl 155,625 im 32-Bit-Format IEEE754: 001 1011 1010 0000 0000 0000 2 971 87761,99584e292 Aus dem Vorstehenden geht hervor, Da der Großteil der Zahlen im IEEE754-Format einen stabilen kleinen relativen Fehler aufweist: Der maximal mögliche relative Fehler für die Zahl ist Single 2 -23 100 11,920928955078125e-6 Der maximal mögliche relative Fehler für die Anzahl von Double 2 -52 100 2,2204460492503130808472633361816d-14 7.5 Allgemeine Informationen für die Anzahl der IEEE-Standard 754 und IEEE-Standard 754. Tabelle 3. Information über das Format 32/64 Bit in der Standard-ANSI / IEEE Std 754-1985 Länge, Bit-Offset der exponentiellen (E ), Bits der Rest der Mantisse (M), Bits denormalisierte Binärzahl normalisierte Binärzahl denormalisierte Anzahl Dezimalzahl F (-1) S 87292 (E -126) 8729 M / 2 23 F (-1) S 87292 (E - 1022) 8729M / 2 52 normierte Nachkommastelle F (-1) S 87292 (E-127) 8729 (1 M / 2 23) F (-1) S 87292 (E-1023) 8729 (1M / 2 52) Abs . Max. Fehlernummer Rel. Max. Fehler-Denormen. Anzahl Rel. Max. Fehler-Normen. Nummer 2 -149 8776 1,401298468729e -45 2 -1074 8776 4,940656468729e -324 2 127 8729 (2-2 -23) 8776 3,402823478729e 38 2 1023 8729 (2-2 -52) 8776 1,797693138729e 308 8 Rundungszahlen im Standard IEEE 754. Bei der Darstellung der Gleitkommazahlen im IEEE-Standard haben 754 oft gerundete Zahlen. Der Standard bietet vier Möglichkeiten zur Rundung von Zahlen. Wege zur Rundung der IEEE 754: Rundung zur nächsten Ganzzahl. Rundung neigt zu Null. Rundung neigt zu 8734 Rundung tendiert zu -8734 Tabelle 3. Beispiele für Rundung auf eine Dezimalstelle auf die nächste ganze Zahl Wie wird die Rundung in den Beispielen in Tabelle 3 dargestellt. Wenn Sie eine Zahl konvertieren, wählen Sie eine der Rundungsarten aus. Standardmäßig ist dies der erste Weg, der auf die nächste Ganzzahl gerundet wird. Oft in verschiedenen Geräten mit dem zweiten Verfahren - gerundet auf Null. Bei Rundung auf Null, einfach zu verwerfen bedeutungslosen Level-Nummern, so ist dies die einfachste in der Hardware-Implementierung. 9. Rechenprobleme, die durch die Verwendung des Standards IEEE754 verursacht werden. IEEE 754 Standard ist weit verbreitet in Engineering und Programmierung. Die meisten modernen Mikroprozessoren werden mit Hardware-Realisierung von Darstellungen von reellen Variablen im Format von IEEE754 hergestellt. Programmiersprache und der Programmierer können diese Situation nicht ändern, eine Ruhe einer reellen Zahl im Mikroprozessor existiert nicht. Beim Erstellen der Standard-IEEE755-1985 Darstellung einer reellen Variable in Form von 4 oder 8 Bytes scheinen sehr großen Wert, da die Menge an RAM MS-DOS gleich 1 MB war. Ein Programm in diesem System könnte nur 0.64 MB verwendet werden. Für moderne Betriebssysteme ist die Größe von 8 Byte null und nichtig, dennoch sind die Variablen in den meisten Mikroprozessoren weiterhin im Format IEEE754-1985. Betrachten Sie die Fehlerberechnung, die durch die Verwendung von Zahlen im Format von IEEE754 verursacht wird. 9.1 Fehler, die mit der Genauigkeit der Darstellung von reellen Zahlen im Format von IEEE754 verbunden sind. Eine gefährliche Reduktion. Dieser Fehler ist immer in Computerberechnungen vorhanden. Der Grund für sein Auftreten ist in Absatz 7.4 beschrieben. -6 für double 10 -14 Die absoluten Fehler können signifikant sein, wie für Single 10 31 und für Double 10 292, die zu Problemen mit Berechnungen führen können. Wenn die Stichprobe auf dem Papier liegt, ist die Antwort 1. Absoluter Fehler ist 7. Warum erhalten Sie die falsche Antwort Nummer 123456789 in der einzigen 4CEB79A3hex (ieee) 123456792 (dec) absolute Fehlermeldung ist 3 Anzahl 123456788 in der einzigen 4CEB79A2hex (ieee) 123456784 (dez.) Absolute Fehlerberichterstattung ist -4 relativer Fehler in den Anfangszahlen von ca. 3,24 e-6 Infolgedessen war ein relativer Betriebsfehler des Ergebnisses 800, dh um 2,5 e 8-mal erhöht. Das nenne ich eine gefährliche Reduktion. Dh eine katastrophale Abnahme der Genauigkeit in dem Betrieb, bei dem der Absolutwert des Ergebnisses viel kleiner als irgendeine der Eingangsvariablen ist. In der Tat, die Fehler-Präzision der Darstellung der am harmlosesten in Computer-Berechnungen, und in der Regel viele Programmierer sind nicht keine Aufmerksamkeit. Trotzdem können sie sehr frustrierend sein. 9.2 Fehler im Zusammenhang mit der missbräuchlichen Ausübung von Datentypen. Wilder Fehler. Diese Fehler werden durch die Tatsache verursacht, dass die ursprüngliche Zahl im Format von Einzel-und Doppel in einem Format nicht in der Regel gleich einander eingereicht. Zum Beispiel: die ursprüngliche Nummer 123456789,123456789 Single: 4CEB79A3 123456792,0 (dec) Double: 419D6F34547E6B75 123456789,12345679104328155517578125 Der Unterschied zwischen Einzel-und Double Betrag: 2,87654320895671844482421875 Hier ist ein Beispiel für VB: relativer Fehler des Ergebnisses ist: 8734 (Unendlich) Dieser Fehler wird als verschmutzte Null bezeichnet. Wenn die Variablen zu demselben Typ führen, wird dieser Fehler nicht auftreten. Daher Variablen und Zwischenergebnisse von Berechnungen auf den gleichen Datentyp gebracht werden. Zum Beispiel die Anforderung, denselben Typ zu zeigen, wie er in der Norm C nach ISO / IEC 9899: 1999 beschrieben ist. Achten Sie darauf, dass nicht genug, nur um alle Original-Daten zu einem einzigen Typ zu bringen. Notwendig, die Ergebnisse der Zwischenoperationen auf den gleichen Typ zu bringen. Hier ist ein Beispiel für einen Fehler im Zwischenergebnis: Hier tritt der Fehler auf, weil das Zwischenergebnis von 1/3 in der Zeile c c-1/3 vom Typ double, nicht single ist. Um den Fehler zu beheben, müssen Sie ein Zwischenergebnis an den Typ des einzelnen Operators mit gegossenen CSng geben. Ein Beispiel für den Datentyp für GNU C, der von Gregory Sitkarevym gesendet wird: In der zweiten Version sehen Sie, dass die Division der Konstanten im Zwischenergebnis der Art des Schwimmers (Einzelpräzision in C) entspricht. Diese Optionen wurden unter Verwendung der GNU C kompiliert und ausgeführt. Wenn Sie die obigen Optionen auf dem VC (Visual Studio) kompilieren und ausführen, werden die Ergebnisse rückgängig gemacht. Das heißt, Option 2 wäre das Ergebnis von -9,934108 und Option 1 Ergebnis: 0,000000. Daher kann es enttäuschende Schlussfolgerung sein, dass das Ergebnis der Berechnungen von der Art und Version des Compilers abhängen kann. In diesem Fall können wir davon ausgehen, dass der VC-Compiler automatisch die Variablentypen anbietet, und der Versuch, denselben Typ zwangsweise einzuziehen, fehlschlägt. Wenn Option 1 (ohne die Besetzung) mit variabler doppelter Präzision (doppelt) zu treffen, dann wird der Fehler nicht bringen Daten und Ergebnis 0,000000 Also in den meisten Fällen, um loszuwerden, die gegossenen Daten ist einfach den Datentyp doppelt verwenden und vergessen Über die Art der einzelnen (float). Berechnungsfehler, die durch nicht bringen der Art von Daten, die ich die wilden Fehler, wie sie auf die Ignoranz der Standards und die Theorie der Programmierung (dh mit schlechter Grundbildung) beziehen sich 9.3 Fehler durch die Verschiebung der Mantisse verursacht. Rundlöcher. Diese Fehler sind mit dem Verlust der Genauigkeit des Ergebnisses in unvollständigen Mantissen-Kreuzungszahlen auf der realen Achse verbunden. Wenn sich die Mantissenzahlen nicht auf der realen Achse schneiden, sind Addition und Subtraktion zwischen diesen Zahlen unmöglich. Zum Beispiel nehmen wir die Anzahl der Single: 47FFFFFF 131071,9921875 (dec) Im Binärsystem sieht diese Zahl folgendermaßen aus: 11111111111111111,1111111 Wir zeigen einige Computeroperationen der Addition und diese Zahl im Format der Single Significant Ziffern in der Mantisse der Binärzahl im Format von Single nicht mehr als 24 Rot zeigt die Figuren jenseits dieser Grenze an und ist nicht im Format Single 1. Addition mit derselben Nummer (Fehlerverschiebung 0.0) beteiligt. 2. zusätzlich zu der Anzahl der kleineren 2-fach (Fehlerverschiebung - 0,00390625). 3. Addition mit einer kleineren Anzahl von 2 23 mal (Fehlerverschiebung - 0,007812). 4. Addition mit einer kleineren Anzahl von 2 24 mal (Fehlerverschiebung - 0,007812). Im letzteren Fall sind die Mantissen von Zahlen getrennt, und arithmetische Operationen mit diesen Zahlen sind bedeutungslos. Wie aus den obigen Beispielen ersichtlich ist, tritt ein Schaltfehler auf, wenn die anfänglichen normierten Zahlen ein unterschiedlicher Exponent sind. Wenn sich die Zahlen um mehr als 2 23 (für Einzel-) und 2 52 (für Doppel) unterscheiden, sind Addition und Subtraktion zwischen diesen Zahlen nicht möglich. Das maximale relative Fehlerergebnis des Vorgangs beträgt etwa 5,96 e-6, was einen relativen Fehler der Repräsentation der Zahl nicht übersteigt (S.9.1). Obwohl der relative Fehler hier in Ordnung ist, gibt es andere Probleme. Zuerst arbeiten Sie mit Zahlen nur in einem engen Bereich der realen Achse, wo die Mantisse schneiden. Zweitens, für jede Quelle der Grenze einer Schleife genannt zyklische Loch. Lassen Sie mich erklären, wenn es einen Zyklus, in dem die ursprüngliche Zahl zu der Summe hinzugefügt wird, gibt es eine numerische Grenze für den Betrag für diese Zahl. Das heißt, die Menge, die eine bestimmte Grße erreicht, hört auf, durch Hinzufügen zu der ursprünglichen Zahl zu steigen. Hier ist ein Beispiel für eine zyklische Löcher in der automatischen Steuerung: Es gibt eine pharmazeutische Pflanze Herstellung von Tabletten mit einem Gewicht von 10 mg. Bestehend aus: Umformmaschine, Lagerung von 500 kg, Verpackungsmaschinen, automatische Steuerung. Spritzgießmaschine speist in den Bunker auf 10 Tabletten auf einmal. Abfüllmaschine nimmt eine Pille. Die automatische Steuerung berücksichtigt die im Trichter der Formmaschine aufgenommenen und aus den Bunker-Verpackungsmaschinen entnommenen Tabletten. Das heißt, es gibt ein Programm, das die Fülltrichterproduktion in kg zeigt. Wenn im Bunker wird über 500 kg Produkt Formmaschine steht auf einer Pause, es enthält den Code in den Bunker wird 200 kg Produkt sein. Füllmaschine zu stoppen, wenn der Bunker weniger als 10 Pfund ist und beginnt, wenn der Bunker wird über 100 kg Produkt sein. Beide Autos können von der Zeit zum Servieren aufhören, nicht abhängig von einander (dank der Bunker). Hier ist ein Beispiel für eine zyklische Löcher in der automatischen Steuerung: Es gibt eine pharmazeutische Pflanze Herstellung von Tabletten mit einem Gewicht von 10 mg. Bestehend aus: Umformmaschine, Lagertank von 500 kg, Verpackungsmaschinen, wie Sie wissen, es funktioniert in einer Endlosschleife. Angenommen, ein Tag Füllmaschine stand zu lange und ein Bunker mit bis zu 300 kg gefüllt. Was geschieht nach dem Einschalten Ein vereinfachtes Beispiel für das Programmzyklusmanagement: In diesem Beispiel nahm die Abfüllmaschine 100 kg Produkt aus dem Trichter auf und das Gewicht der Produkte im Trichter hat sich nicht geändert. Warum nicht ändern Weil die Mantissen Zahlen 300 und 0,00001 Disjoint-Format einzigen. Anschließend das Gewicht des Spritzgiessmaschinenbehälters auf 500 kg bringen und stoppen. Abfüllmaschine nimmt alle Tabletten vom Trichter und stoppt auch. Das Programm zeigt das Gewicht von 500kg im Bunker. Kommen Sie mit Spezialisten, Testsensoren, Drähte, Computer, und sagen, dass das Programm hing. Aber das Programm hängt nicht, es fährt fort, reibungslos zu laufen und jede Überprüfung bestätigt dies. Einfach die Zahl von 0,0001 Treffer in der zyklischen Loch und aus dieser kann nicht. Als Ergebnis hatten wir Glück, dass es eine pharmazeutische Anlage, nicht die Sayan-Shushenskaya GES war. Tatsächlich würde ein erfahrener Programmierer niemals eine zyklische Subtraktion (oder Summierung) auf diese Weise durchführen. Dieses Beispiel ist fiktiver Zweck, und so kann nicht in Betracht gezogen werden, obwohl in Bezug auf Mathematik sind alle makellos. Dieser Fehler ist typisch für Mathematiker und Anfänger Programmierer. Ich würde sagen, dass die Hauptarbeit des Programmierers ist, mit Fehlern zu kämpfen, aber nicht in der mathematischen Lösung des Problems. Hier ist ein Beispiel für eine korrekte Lösung für dieses Problem, mit freundlicher Genehmigung von Sitkarevym Gregory: Das vorangehende Beispiel ist genommen vom realen industriellen Paket. Aus Gründen der Übersichtlichkeit vereinfachen wir das obige Beispiel. Wie aus diesem Beispiel ersichtlich ist, muss der Programmierer den Fehler des Ergebnisses in jedem Zyklus berechnen, um ihn im nächsten Zyklus zu berücksichtigen. Beachten Sie, dass der Programmierer absolut bereit sein sollte, einige grundlegende Konzepte der Mathematik in den Berechnungen im Format IEEE754 nicht zu erfüllen. Zum Beispiel werden die Regeln der algebraischen Kommutativität (a b) a (a c) b in der Regel nicht in diesen Berechnungen durchgeführt. Leider in der heutigen grundlegenden Bildung, die sehr wenig Aufmerksamkeit erhält. 9.4 Fehler aufgrund von Rundungen. Schmutzig null. Wenn Computerberechnungen zwei Arten von Rundungen unterscheiden können: 1. Das Ergebnis der arithmetischen Operation wird immer gerundet. 2. Ausgabe und Eingabe einer reellen Zahl im Fenster Windows wird gerundet. Im ersten Fall wird die Variable auf eine von 4 Rundungsarten IEEE754 gerundet, die Standardrundung auf die nächste ganze Zahl. In diesem Fall erhält die Variable einen neuen gerundeten Wert. In S.9.2 betrachteten wir die Addition zweier identischer Zahlen: 1. Addition mit derselben Zahl (Fehlerverschiebung 0.0). Hier ist das Ergebnis der Addition von zwei Zahlen absolut genau, aber das Ergebnis wurde durch einen Mikroprozessor abgerundet. Somit ist dem exakten Ergebnis ein Rundungsfehler hinzugefügt worden. Im Allgemeinen ist der Rundungsfehler innerhalb der Genauigkeit der Zahlen. Im zweiten Fall ändert die Variable nicht ihre Bedeutung, nur in Windows-Fenster zeigt den gerundeten Wert der reellen Zahlen. Es stellt sich heraus, dass die ursprüngliche Variable und die Anzeige in Windows ist eine andere Zahl. Dies ist nicht der Fehler des Formats IEEE754, das ist ein Fehler Windows. Einzelne Variable wird in der Windows 7 signifikanten Zahlen auf die nächste ganze Zahl gerundet angezeigt. 3DFCD6EA 0,12345679104328155517578125 Feld wird angezeigt als 0,1234568 Bei Variablen vom Typ Double zu einer Windows-Box werden 15 signifikante Ziffern gerundet auf die nächste ganze Zahl angezeigt. 3FBF9ADD3746F67D 0,12345678901234609370352046653351862914860248565673828125 angezeigt, wie ,123456789012346 Die Frage, wie wichtige Variable, wenn wir gehen in die Fenster von Windows 0,123456789012346 Dieser Wert wird auf diese Zahl entspricht: 3FBF9ADD3746F676 0,1234567890123459965590058118323213420808315277099609375 Das heißt, der Wert von 3FBF9ADD3746F67D wir in der Regel nicht direkt einfügen können in Den Programmcode. Aber wir können betrügen und fügen in die x 0.123456789012346 1 E-16. Die resultierende Variable ist gleich 3FBF9ADD3746F67D (wird im Beispiel von dirty zero verwendet) Display oder an einen PC über das Fenster ist eine Zahl unmöglich. Als Folge der Aktion entsteht Windows eine Reihe von unangenehmen Situationen. 1. Sie haben keine technischen Möglichkeiten, die genauen Werte anzuzeigen oder einzugeben. Der Variablen in den Fenstern, die an sich sehr traurig ist. 2. Das Auftauchen von schwerwiegenden Fehlern, wie schmutzig Null. Dirty zero ist, wenn Sie oder das Programm davon ausgehen, dass die Variable ungleich Null ist - null Sehr häufig tritt dieser Fehler in der Schnittstelle des Maschinenbedieners auf. Zum Beispiel nach dem Zurücksetzen des Gewichts von Verpackungsprogrammen. Das Ergebnis des Programms im obigen Beispiel Infolgedessen ist eine Variable, die der Operator null Null nennt, nicht gleich. Der relative Fehler des Ergebnisses ist unendlich. In den logischen Vergleichsoperationen, die nicht Null sind, kann die Programmausführung zu einem anderen Zweig des Algorithmus umgeleitet werden. 9.5 Fehlerquote bei den Norma / Denorma-Zahlen. Die Zahl der Mörder. Diese Fehler treten bei der Arbeit mit Zahlen auf, die sich am Rand der normalisierten / denormalisierten Zahlenrepräsentation befinden. Sie sind mit Unterschieden in der Darstellung von Zahlen im IEEE754-Format verbunden und übertragen die Differenzformeln im IEEE754-Format reale Zahlen. Das heißt, das Gerät (oder die Software) sollte unterschiedliche Algorithmen abhängig von der Position einer reellen Zahl auf einem Zahlenzeilenformat verwenden. Darüber hinaus führt es zu einer Komplikation von Geräten und Algorithmen, gibt es noch Unsicherheiten der Übergangszone. Die Ungewißheit der Übergangszone besteht darin, daß der Standard keinen spezifischen Wert der Übergangsgrenze definiert. Im Wesentlichen ist der Übergang Grenze zwischen zwei reellen Zahlen: Die letzte denormalisierter Nummer 000FFFFFFFFFFFFF: Genaue dezimal Wert dieser Zahl: 2,2250738585072008890245868760858598876504231122409594654935248025624400092282356951787758888037591552642309780950 4343120858773871583572918219930202943792242235598198275012420417889695713117910822610439719796040004548973919380791 9893608152561311337614984204327175103362739154978273159414382813627511383860409424946494228631669542910508020181592 6642134996606517803095075913058719846423906068637102005108723282784678843631944515866135041223479014792369585208321 5976210663754016137365830441936037147783553066828345356340050740730401356029680463759185831631242245215992625464943 0083685186171942241764645513713542013221703137049658321015465406803539741790602258950302350193751977303094576317321 0852507299305089761582519159720757232455434770912461317493580281734466552734375e-308 und die erste normalisierte Zahl 0010000000000000: Genaue Dezimalwert dieser Nummer: 2,2250738585072013830902327173324040642192159804623318305533274168872044348139181958542831590125110205640673397310 3581100515243416155346010885601238537771882113077799353200233047961014744258363607192156504694250373420837525080665 0616658158948720491179968591639648500635908770118304874799780887753749949451580451605050915399856582470818645113537 9358049921159810857660519924333521143523901487956996095912888916029926415110634663133936634775865130293717620473256 3178148566435087212282863764204484681140761391147706280168985324411002416144742161856716615054015428508471675290190 3161322778896729707373123334086988983175067838846926092773977972858659654941091369095406136467568702398678315290680 984617210924625396728515625e-308 Da die Grenze eine reelle Zahl ist, kann seine Präzision bis ins Unendliche und digitalen Gerät oder Programm eingestellt werden kann, nicht das Bit für eine Entscheidung zu haben, um etwas Bereich der Anzahl enthalten. Zum Beispiel kann ein 53632 Bug für PHP, die Panik verursacht Anfang 2011 lt htmlgt ltbodygt ltphp d 2.2250738585072011e-308 gt enden lt / bobygt lt / htmlgt eine Reihe 2.2250738585072011e-308 Geben Sie einen Hang des Prozesses mit fast 100 CPU-Last verursacht . Andere Zahlen aus dieser Reihe von Problemen verursacht (2.2250738585072009e-308, 2.2250738585072010e-308, 2.2250738585072012e-308) Fehler melden erhielt 30.12.2010, 10.01.2011 vom Entwickler festgelegt. Da PHP ein Präprozessor ist, der von den meisten Servern verwendet wird, konnte jedes beliebige Benutzer-Netzwerk innerhalb von 10 Tagen jeden Host schließen. Wie die Entwickler schreiben, dass der Fehler nur in 32-Bit-Systemen funktioniert, aber wenn Sie die Genauigkeit der Grenze zu erhöhen, dann denke ich, dass die 64-Bit-Systeme auch hängen (nicht überprüft). Der Grund für die Panik ist klar: Jeder Benutzer hatte auf einem gewissen Grad an Sorgfalt und Wissen die Möglichkeit, die meisten Informationsquellen des Planeten innerhalb von zehn Tagen zu reduzieren. Ich möchte nicht - würde dazu führen, dass mehr Beispiele für solche Zahlen und solche Fehler. 10 Der letzte Teil Aus dem obigen ist klar, dass die Ansicht, dass das Gleitkomma-Ergebnis nicht über den relativen Fehler beim Melden der größten Anzahl hinausgeht, falsch ist. Die in Punkt 9 aufgeführten Fehler werden addiert. Solche Fehler wie schmutzige und gefährliche Nullreduktion können Berechnungsfehler inakzeptabel machen. Besondere Aufmerksamkeit in der Programmierung von Computer-Berechnungen sollte der Programmierer an die Ergebnisse in der Nähe von Null bezahlt werden. Einige Experten glauben, dass das Format der Zahlen eine Bedrohung für die Menschheit darstellt. Sie können in dem Artikel über sie gelesen IEEE754-tick Menschheit Obwohl viele der Fakten in diesem Artikel über dramatisiert und möglicherweise falsch interpretiert droht, aber das Problem ist computing richtig philosophisch reflektiert. Im nicht eine Dramatisierung der Berechnungen auf dem Standard IEEE754. Standard-Betrieb seit 1985 und vollständig in die Norm IEEE754-2008 eingegeben, die die Genauigkeit der Berechnungen erweitert. Allerdings ist das Problem der Zuverlässigkeitsrechnung heute sehr dringend, und die Norm IEEE754-2008 und ISO-Empfehlungen haben dieses Problem nicht gelöst. I think in this area needed an innovative idea that developers Standard IEEE754-2008 unfortunately do not possess. Innovative ideas usually come from. The main innovative ideas in our world were made by amateurs (like-minded people not for money). A striking example of this situation was the invention of the phone. When a school teacher Alexander Graham Bell (Alexander Graham Bell) came up with a patent for an invention of the telephone to the president of telecommunications company Western Union Company, which is owned by the transatlantic cable connection with an offer to buy his patent for the invention of the telephone, he was not expelled - no. The president of that company offered to consider this question the advice of experts in the field of telegraphy, consisting of specialists and scholars in the field of telecommunications. Experts gave their opinion that this invention is useless in the field of telecommunications and it is futile. Some experts have even written a report that it tsirkachestvo and charlatanism nbsp nbsp Alexander Graham Bell, along with his father in law, decided independently to promote his invention. After about 10 years, the telecommunications giant Western Union Co. was virtually eliminated phone business from the sphere of telecommunication technologies. Today you can see in many Russian cities windows that says Western Union, this company which is engaged in transferring money around the world, and once she was the international telecommunications giant. We can conclude: opinions of experts in innovative technologies are useless If you think that since the invention of the telephone (1877) in peoples minds that something has changed, youre wrong. If scientists (who are inventing new) and professionals (who know how to use the well-known) can not solve the problem, you need innovation. Links to new ideas in the field of representation of real numbers in hardware: 1. Approksimetika 2. If you know of other innovative ideas in the field of representations of real numbers, then we will be happy to get links to these sources. I would suggest to represent real numbers as fixed-point. To view the full range of numbers Double enough to have a variable consisting of 1075 bits integer part and 1075 bits of fractional part, ie about 270 bytes per variable. In this case, all numbers will be presented with the same absolute accuracy. You can work with numbers in the entire range the real axis, that is, it becomes possible to summarize large numbers of small numbers. Step numbers on the real axis is uniform, that is the real axis is linear. The data type will be only one, ie do not need the whole, real and other types. Here the problem is the realization of registers of microprocessors dimension of 270 bytes, but its not a problem for modern technology. To write p.9 I had to create a program that represents a number as a variable to a fixed point, long 1075.1075 bytes. Where the number can be represented as a string of characters ASCII, ie one symbol equals one digits. Just had to write all the arithmetic operations with strings ASCII. This program is similar to a paper calculation. Since mathematical ability microprocessor in it are not used, she said slowly. Why I did it I could not find a program that could accurately represent the number of IEEE754 format, in decimal form. I also did not find the program (although they certainly have what no doubt) where you can enter in box 1075 of significant decimal digits. Here for example just the decimal value of the number of double 7FEFFFFFFFFFFFFF: 17976931348623157081452742373170435679807056752584499659891747680315726078002853876058955 863276687817154045895351438246423432132688946418276846754670353751698604991057655128207624 549009038932894407586850845513394230458323690322294816580855933212334827479782620414472316 8738177180919299881250404026184124858368,0 You can use the IEEE754 v.1.0 nbsp to study and evaluate the errors when working with real numbers given in the format of IEEE754. References: 1. IEEE Standard for Binary Floating-Point Arithmetic. Copyright 1985 by The Institute of Electrical and Electronics Engineers, Inc 345 East 47th Street, New York, NY 10017, USA Acknowledgments: Sitkarevu Grigory(sitkarevkomitex. ru, sinclair80gmail). For assistance in creating an article. Archive of reviews with comments nbsp View nbspnbsp (Send us feedback on the e-mail: infosoftelectro. ru )
Comments
Post a Comment