3

私はVB6内から何年も使用されてきたDLL(コードはありません)に独自のライブラリを持っています。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 桁のノイズがあり、ファイルにバイナリを書き出すと、それらが異なるバイナリ値であることを確認できます)。 . これらの値がまったく同じに計算されない理由、またはこれを修正またはデバッグする方法について誰かアドバイスがありますか?

4

1 に答える 1

4

これはおそらく、倍精度に使用される標準が異なるために発生します

  • VB6は、(当時の)パフォーマンス上の理由から、デフォルトでは精度の低い内部標準を使用しています。
  • .NETは、バイナリ浮動小数点演算のIEEE754標準に準拠しています

/OPフロートの一貫性を向上させるオプションを使用して、VB6アプリケーションをコンパイルできます。

デフォルトでは、コンパイラーはコプロセッサーの80ビット・レジスターを使用して、浮動小数点計算の中間結果を保持します。これにより、プログラムの速度が上がり、プログラムのサイズが小さくなります。ただし、計算にはメモリ内で80ビット未満で表される浮動小数点データ型が含まれるため、長い計算で余分なビットの精度(80ビットから小さい浮動小数点型のビット数を引いたもの)を実行すると、生成される可能性があります。一貫性のない結果。(出典:MSDN

于 2012-04-13T19:57:12.967 に答える