我有一個在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小數點的位置,二進制寫入文件會驗證它們是不同的二進制值) 。有沒有人有任何建議,爲什麼這些值可能計算不完全相同或我可能會修復或調試?
你有這個「MS雙」標準(甚至討論它的存在)的任何參考?爲什麼輸入的二進制表示完全匹配,輸出只有幾位?這些表示是否非常相似? – user12861 2012-04-13 20:00:34
@ user12861編輯我的答案,使其更加精確並添加了參考。 – 2012-04-13 20:09:32
+1。雖然我不同意一些細節。默認的VB6內部表示比*更精確*而不是更精確! 80> 64。此外,像這樣的編譯器優化現在在計算密集型程序中仍然非常相關。 – MarkJ 2012-04-13 20:22:21