2012-04-13 47 views
3

我有一個在VB6中使用多年的DLL中的專有庫(我沒有代碼)。我試圖將VB6代碼升級到C#,並希望使C#代碼完全複製VB6行爲。我無法準確地在每個環境中調用DLL匹配時完成某些計算的雙精度結果。從VB6和C#調用DLL以雙精度給出稍微不同的結果

在VB6我有這樣的事情(註文件讀寫是確保完全一樣的價值觀的使用和產生的):

Dim a As Double, b As Double, c As Double, d As Double 
Open "C:\input.txt" For Binary As #1 
Get #1, , a 
Get #1, , b 
Get #1, , c 
Get #1, , d 
Close #1 
Dim t As New ProprietaryLib.Transform 
t.FindLine a, b, c, d 
Open "C:\output.txt" For Binary As #1 
Put #1, , t.Slope 
Put #1, , t.Intercept 
Close #1 

在C#中我有這樣的事情:

System.IO.BinaryReader br = new System.IO.BinaryReader(System.IO.File.Open(@"C:\input.txt", System.IO.FileMode.Open)); 
double a, b, c, d; 
a = br.ReadDouble(); 
b = br.ReadDouble(); 
c = br.ReadDouble(); 
d = br.ReadDouble(); 
br.Close(); 
ProprietaryLib.Transform t = new ProprietaryLib.Transform(); 
t.FindLIne(a, b, c, d); 
System.IO.BinaryWriter bw = new System.IO.BinaryWriter(System.IO.File.Open(@"C:\output2.txt", System.IO.FileMode.Create)); 
bw.Write(t.Slope); 
bw.Write(t.Intercept); 
bw.Close(); 

我已驗證輸入正在以相同方式讀取(通過將二進制值重寫爲文件進行驗證),因此將相同的雙精度數字輸入到DLL中。輸出值非常相似,但並不完全相同(有時數值的最低有效部分會關閉,超出15至17小數點的位置,二進制寫入文件會驗證它們是不同的二進制值) 。有沒有人有任何建議,爲什麼這些值可能計算不完全相同或我可能會修復或調試?

回答

4

這可能發生,因爲用於雙精度

  • VB6不同標準默認使用不太精確的內部標準(後面再)性能的原因。
  • .NET與二進制浮點運算

可以使用/OP選項來提高浮點一致性編譯VB6應用程序的IEEE 754標準。

默認情況下,編譯器使用協處理器的80位寄存器來保存浮點計算的中間結果。這增加了程序速度並減小了程序大小。但是,由於計算涉及浮點數據類型,這些浮點數據類型在內存中的表示少於80位,因此通過冗長的計算攜帶精度的額外位(80位減去較小浮點類型中的位數)可能會產生不一致的結果。 (來源:MSDN

+0

你有這個「MS雙」標準(甚至討論它的存在)的任何參考?爲什麼輸入的二進制表示完全匹配,輸出只有幾位?這些表示是否非常相似? – user12861 2012-04-13 20:00:34

+0

@ user12861編輯我的答案,使其更加精確並添加了參考。 – 2012-04-13 20:09:32

+3

+1。雖然我不同意一些細節。默認的VB6內部表示比*更精確*而不是更精確! 80> 64。此外,像這樣的編譯器優化現在在計算密集型程序中仍然非常相關。 – MarkJ 2012-04-13 20:22:21