gpt4 book ai didi

c# - 从 VB6 和 C# 调用 DLL 的 double 结果略有不同

转载 作者:行者123 更新时间:2023-11-30 15:39:36 24 4
gpt4 key购买 nike

我在 DLL 中有一个专有库(我没有代码),该库已在 VB6 中使用多年。我正在尝试将 VB6 代码升级到 C#,并希望使 C# 代码完全复制 VB6 行为。当从每个环境调用时,我无法使在 DLL 中完成的某些计算的 double 结果完全匹配。

在 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();

我已验证输入正在被相同地读取(通过将二进制值重写到文件来验证),因此相同的 double 字被提供给 DLL。输出值非常相似,但不完全相同(值有时在数字的最低有效部分偏离,在小数点后第 15-17 位的噪音中,二进制写入文件验证它们是不同的二进制值) .有没有人对为什么这些值的计算可能不完全相同或者我如何修复或调试它有任何建议?

最佳答案

这可能是因为 double 使用的标准不同所致

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

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

By default, the compiler uses the coprocessor’s 80-bit registers to hold the intermediate results of floating-point calculations. This increases program speed and decreases program size. However, because the calculation involves floating-point data types that are represented in memory by less than 80 bits, carrying the extra bits of precision (80 bits minus the number of bits in a smaller floating-point type) through a lengthy calculation can produce inconsistent results. (Source: MSDN)

关于c# - 从 VB6 和 C# 调用 DLL 的 double 结果略有不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10147436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com