gpt4 book ai didi

vb.net - UInt64 在做大数学运算时变得不稳定?

转载 作者:行者123 更新时间:2023-12-03 00:30:17 25 4
gpt4 key购买 nike

我从一些大数学中得到了一个奇怪的结果,并且不知道为什么我从 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 在两个调试器中都是匹配的 - !! ??

有什么想法吗? =+ 谢谢

杰出的乔恩 - 非常 Eloquent 且有效!一个小小的后续行动你能建议对最终作品进行修复吗?我相信即使你理顺了我的 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

最佳答案

我已将您的 VB 代码反编译为 C#,它看起来像这样:

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

这是因为power operator在 VB 中始终返回 Double:

The result is number raised to the power of exponent, always as a Double value.

我建议使用移位运算符,并将所有变量设置为 UInt64,以便移位 64 位整数:

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

这给出了正确的答案。 (您实际上并不需要将 LSB 设为 UInt64,但您也可以使用 64 位整数执行所有操作。)

关于vb.net - UInt64 在做大数学运算时变得不稳定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9523621/

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