Frage

Meine Kunden Anwendung Exporte und Importe nicht wenige Variablen vom Typ real durch eine Textdatei writeln und readln verwenden. Ich habe versucht, geschrieben, um die Breite der Felder zu erhöhen, so der Code wie folgt aussieht:

writeln(file, exportRealvalue:30); //using excess width of field
....
readln(file, importRealvalue);

Wenn ich exportieren und dann Import und Export wieder und vergleichen Sie die Dateien, die ich einen Unterschied in den beiden letzten Ziffern erhalten, z (vielleicht aus von der tatsächlichen Anzahl der Stellen sein hier, aber Sie bekommen es):

-1.23456789012E-0002
-1.23456789034E-0002

Das macht tatsächlich einen Unterschied in der App, sodass der Kunde wissen will, was ich dagegen tun kann. Jetzt bin ich nicht sicher, dass es nur die Schreib- / Lese, die es tut, aber ich dachte, dass ich aus einer kurzen Frage werfen würde dort, bevor ich in denen tauchen hey Stack wieder. Muss ich auf dieses binäre gehen?

Dies ist nicht eine App mit Währung oder etwas zu tun, ich habe gerade schreiben und die Werte in / aus einer Datei lesen. Ich weiß, Gleitpunkte ein bisschen seltsam sind manchmal und ich dachte, eine der Routinen (writeln / readln) können einige lustige Geschäft los haben.

War es hilfreich?

Lösung

Wenn Sie die Genauigkeit eines echten mit einem WriteLn angeben möchten, verwenden Sie die folgenden Schritte aus:

WriteLn(RealVar:12:3);

Es gibt den Wert Realvar mit mindestens 12-Positionen und eine Genauigkeit von 3.

Andere Tipps

Sie könnten versuchen, die Umstellung auf erweitert für eine höhere Präzision. Wie jedoch darauf hingewiesen, nur Gleitkommazahlen haben so viele signifikanten Stellen an Präzision, so ist es immer noch möglich, mehr Ziffern angezeigt werden dann genau gespeichert werden, die im Verhalten angegeben Sie führen könnte.

Von der Delphi-Hilfe:

Fundamental Win32 echte Typen

                                            | Significant | Size in 
Type     | Range                            | digits      | bytes
---------+----------------------------------+-------------+----------
Real     | -5.0 x 10^–324 .. 1.7 x 10^308   | 15–16       |   8  
Real48   | -2.9 x 10^–39 .. 1.7 x 10^38     | 11-12       |   6   
Single   | -1.5 x 10^–45 .. 3.4 x 10^38     |  7-8        |   4   
Double   | -5.0 x 10^–324 .. 1.7 x 10^308   | 15-16       |   8   
Extended | -3.6 x 10^–4951 .. 1.1 x 10^4932 | 10-20       |  10   
Comp     | -2^63+1 .. 2^63–1                | 10-20       |   8   
Currency | -922337203685477.5808..          |             | 
                    922337203685477.5807    | 10-20       |   8   
  

Hinweis : Die Sechs-Byte Real48 Typ genannt wurde Echt in früheren Versionen von Object Pascal. Wenn Sie Code neu kompilieren, die den älteren, Sechs-Byte-Typen Real in Delphi verwendet, können Sie es auf Real48 ändern . Sie können auch die {$ REALCOMPATIBILITY ON} Compiler-Direktive verwenden, um Sie Echt zurück in den Sechs-Byte-Typ. Die folgenden Ausführungen beziehen sich auf grundlegende echte Typen.

     
      
  • Real48 wird für die Abwärtskompatibilität beibehalten. Da das Speicherformat der Intel-Prozessorarchitektur nicht heimisch ist, ergibt sich eine geringere Leistung als andere Gleitkommatypen.
  •   
  • Erweitert bietet eine höhere Präzision als andere echte Typen, aber weniger tragbar. Seien Sie vorsichtig mit Erweitert, wenn Sie Dateien erstellen, auf allen Plattformen zu teilen.
  •   

Beachten Sie, dass der Bereich größer als die signifikanten Stellen. So können Sie eine Nummer haben größere kann dann genau gespeichert werden. Ich würde empfehlen, die signifikanten Stellen gerundet, das zu verhindern.

Wenn Punkttypen mit schwimmenden, sollten Sie auf den angegebenen Typen kennen die Präzision Einschränkungen sein. Ein 4-Byte-IEEE-754-Typ, zum Beispiel, hat nur etwa 7,5 signifikante Stellen der Präzision. Ein acht Byte IEEE-754-Typ hat etwa die doppelte Anzahl von signifikanten Stellen. Offenbar hat die delphi echte Art, die eine Präzision, die etwa 11 signifikante Stellen liegt. Das Ergebnis davon ist, dass alle zusätzlichen Ziffern der Formatierung, die Sie wahrscheinlich sein Rauschen an, die in Konvertierungen zwischen Basis 10 formatiert Werte und Basis 2 Gleitkommazahlen führen kann.

Als erstes möchte ich versuchen, um zu sehen, ob ich Hilfe verwenden Str mit verschiedenen Argumenten oder die Erhöhung der Präzision der Typen in Ihrer App bekommen. (Haben Sie versucht Extended mit?)

zusammen mit der binären Darstellung in einer sortierten Liste

Als letztes Mittel, ( Achtung! Abhilfe !! ) Ich würde versuchen, den String-Darstellung des Kunden zu speichern. Vor dem Schreiben einen Gleitkommawert zurück würde ich sehen, ob es bereits ein passender Wert in der Tabelle ist, deren Darstellung String ist bereits bekannt und kann stattdessen verwendet werden. Um schnell zu bekommen diese Lookup zu machen, können Sie es auf dem numerischen Wert sortieren und binäre Suche verwenden, um die beste Übereinstimmung zu finden.

Je nachdem, wie viel Verarbeitung Sie tun müssen, um eine Alternative könnte die Zahlen im BCD-Format zu halten sein, um ursprüngliche Genauigkeit zu erhalten.

Es ist schwer, dies zu beantworten, ohne zu wissen, was geben Sie Ihre ExportRealValue und ImportRealValue ist. Wie andere erwähnt haben, haben die echten Typen für alle unterschiedlichen Genauigkeiten.

Es ist erwähnenswert, im Gegensatz zu einigem Nachdenken verlängert wird nicht immer höhere Präzision. Extended 10-20 signifikante Zahlen, wo Doppel 15-16 ist. Wie Sie Probleme haben, um den zehnten sig Abb vielleicht sind Sie bereits erweitert.

Um mehr Kontrolle über das Lesen und Sie schreiben, die Zahlen und Strings selbst umwandeln und schreibt sie in eine Datei-Stream. Wenigstens auf diese Weise müssen Sie sich keine Sorgen, wenn readln und writeln bis zu nicht gut hinter dem Rücken sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top