从 VB6 和 C# 调用 DLL 在双精度下给出的结果略有不同

本文关键字:结果 VB6 调用 DLL 双精度 | 更新日期: 2023-09-27 18:31:15

我在 DLL 中有一个专有库(我没有代码),该库已在 VB6 中使用多年。 我正在尝试将 VB6 代码升级到 C#,并希望使 C# 代码完全复制 VB6 行为。 当从每个环境调用时,我无法使 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 位的噪声中,二进制写出到文件验证它们是不同的二进制值)。 有没有人对为什么这些值的计算方式可能不完全相同或我如何修复或调试它有任何建议?

从 VB6 和 C# 调用 DLL 在双精度下给出的结果略有不同

这可能是因为双精度使用不同的标准

  • 出于(当时)性能原因,VB6 默认使用不太精确的内部标准。
  • .NET 符合 IEEE 754 二进制浮点运算标准

您可以使用 /OP 选项编译 VB6 应用程序以提高浮点一致性。

默认情况下,编译器使用协处理器的 80 位寄存器来保存浮点计算的中间结果。这提高了程序速度并减小了程序大小。但是,由于计算涉及在内存中用小于 80 位表示的浮点数据类型,因此通过冗长的计算携带额外的精度位(80 位减去较小浮点类型的位数)可能会产生不一致的结果。(来源:MSDN)