4

いくつかの大きな数学から奇妙な結果が出て、vb.netとpythonで異なる答えが得られる理由がわかりません。

クイックスニペットと結果は次のとおりです。

VB.NET
Dim MSB As UInt32 = 3067297518
Dim LSB As UInt32 = 1439785590
Dim sqln As UInt64 = MSB * (2 ^ 32) + LSB 

Python:
sqln = msb * (2 ** 32) + lsb

Python Result: 13173942528351756918
VB RESULT:     13173942528351756288

注:sqlnをULongおよびDoubleとして宣言することも試みます(同じ回答)。MSBとLSBは両方のデバッガーで一致します-!! ??

何か案は?=+ありがとう

傑出したジョン-非常に雄弁で、うまくいきます!ちょっとしたフォローアップで、最後のピースの修正を提案できますか?私のsqlnをまっすぐにしたとしても、同じようなことが起こっていると思います:)

python says: = bdntyxtax2smq
vb.net says: = bfpuzytbx3s00

VB.NET
Dim sqlid As String = ""
Dim alphabet As String = "0123456789abcdfghjkmnpqrstuvwxyz"
For iCount = 0 To 12
    sqlid = alphabet((sqln / (32 ^ iCount)) Mod 32) + sqlid
Next

Python:
for i in range(0, 13):
    sqlid = alphabet[(sqln / (32 ** i)) % 32] + sqlid
4

1 に答える 1

4

VBコードをC#として逆コンパイルしましたが、次のようになります。

uint MSB = 0xb6d33eee;
uint LSB = 0x55d16276;
ulong sqln = (ulong) Math.Round((double) ((num2 * 4294967296) + num));

これは、VBの電力演算子が常にDouble:を返すためです。

結果は、常にDouble値として、指数の累乗で累乗された数値です。

シフト演算子を使用し、すべての変数を作成して、64ビット整数にUInt64シフトすることお勧めします。

Dim MSB As UInt64 = 3067297518
Dim LSB As UInt64 = 1439785590
Dim sqln As UInt64 = (MSB << 32) + LSB 

それは正しい答えを与えます。(実際にはである必要はありませんがLSB、64ビット整数ですべてUInt64を実行することもできます。)

于 2012-03-01T20:40:50.717 に答える