2008-09-29 33 views
2

我的客戶端應用程序通過使用writeln和readln的文本文件輸出和輸入相當多的real類型變量。我試着寫增加字段的寬度,使代碼看起來像:再次進出口Delphi通過writeln/readln實現的精度

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

當我導出,然後和比較的文件,我得到的最後兩位數字,如差異(可能是關上的數字在這裏的實際數量,但你得到它):

-1.23456789012E-0002 
-1.23456789034E-0002 

這實際上使得在應用程序的不同,因此客戶想知道什麼我可以做些什麼。現在我不確定這是否只是寫/讀,但我認爲在我再次深入嘿堆棧之前,我會提出一個簡單的問題。我需要對此進行二元化嗎?

這不是一個處理貨幣或應用程序的應用程序,我只是在文件中寫入和讀取值。我知道浮點有時有點奇怪,我認爲其中一個例程(writeln/readln)可能會有一些有趣的事情在進行。

+0

浮點數有四捨五入的問題。它是什麼類型的應用程序,財務,科學等? 查看此線程以獲取更多信息:http://stackoverflow.com/questions/149033/best-way-to-store-currency-values-in-c – stukelly 2008-09-29 18:49:46

回答

2

如果你想用WriteLn指定一個真正的精度,使用以下命令:

WriteLn(RealVar:12:3); 

它輸出至少爲12個位置中的值Realvar和3

+0

+1!多奇怪的事實! – 2010-02-12 01:31:01

0

使用浮點類型時,應該知道指定類型的精度限制。例如,一個4字節的IEEE-754類型只有大約7.5位的精度。一個八字節的IEEE-754類型的有效數字的數量大約增加了一倍。顯然,delphi真實類型的精度約爲11位有效數字。這樣做的結果是,您指定的格式的任何額外數字都可能是噪聲,可能導致基本10格式值與基本2浮點值之間的轉換。

7

爲了更高的精度,您可以嘗試切換到擴展。正如所指出的那樣,浮點數只有很多有效數字的精度,所以仍然可以顯示更多的數字然後精確地存儲,這可能會導致您指定的行爲。

從德爾福幫助:

基本的Win32真正的類型

 
              | 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 

注意:6字節Real48類型被稱爲早期版本的Object Pascal中的真實。如果您在Delphi中重新編譯使用較舊的六字節Real類型的代碼,則可能需要將其更改爲Real48。您也可以使用{$ REALCOMPATIBILITY ON}編譯器指令將Real重新轉換爲六字節類型。以下說明適用於基本實際類型。

  • Real48保持向後兼容。由於其存儲格式不是英特爾處理器體系結構的本機特性,因此其性能比其他浮點類型慢。
  • 擴展提供比其他實際類型更高的精度,但便攜性較差。如果您要創建數據文件以跨平臺共享,請小心使用Extended。

注意,範圍是大於所述顯著數字。所以你可以有一個更大的數字,然後可以準確地存儲。我建議四捨五入到有效數字以防止發生。

0

首先,我會嘗試看看是否可以通過使用帶有不同參數的Str或增加應用程序中類型的精度來獲得任何幫助。 (你有沒有嘗試過使用擴展?)

作爲最後的手段,(警告!解決方法!)我會嘗試爲客戶節省的字符串表示與排序列表的二進制表示一起。在寫回浮點值之前,我會看看錶中是否有匹配值,其字符串表示形式是已知的,可以用來替代。爲了快速找到這個查詢,您可以按數字值對其進行排序,並使用二進制搜索來查找最佳匹配。

0

根據精密您需要做多少處理,另一種方法是將數字保留爲BCD格式以保留原始準確性。

0

如果不知道您的ExportRealValue和ImportRealValue是什麼類型,很難回答這個問題。正如其他人所說,實際類型都有不同的精度。

值得注意的是,與一些想法相反,擴展並不總是更高的精度。 Extended是10-20有效數字,其中Double是15-16。由於您在第十個信號圖附近遇到問題,因此您可能已使用擴展。

爲了更好地控制讀寫,您可以自己將字符串轉換爲字符串,也可以將字符串轉換爲文件流。至少這樣你不必擔心,如果讀取和寫入的背後不好。