2012-03-01 51 views
4

我有一個奇怪的結果來自一些大數學&不知道爲什麼我從vb.net vs python得到不同的答案。UInt64在做大數學時會不知所措?

這裏是快速片段&結果:

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作爲一個烏龍和雙(相同的答案) 的MSB和LSB是一根火柴,在這兩種調試器 - ! ??

任何想法? = +我的謝謝

傑出的喬恩 - 非常雄辯的&它的工作原理! 有一點跟進可以爲最後的作品提供一個修補程序嗎?我相信,即使你得到了我的sqln理順:)

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

VB.NET 
Dim sqlid As String = "" 
Dim alphabet As String = "abcdfghjkmnpqrstuvwxyz" 
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

我反編譯的VB代碼爲C#中的同樣的事情正在發生,它看起來像這樣:

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

這是因爲在VB中power operator總是返回Double

結果數提升到冪的,總是作爲一個Double值。

我會建議使用移位運算,並使所有變量UInt64,使換檔完成 64位整數:

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

這給出了正確的答案。 (你實際上並不需要LSB是一個UInt64,但你不妨做一切 64位整數。)

+0

很有口才和它的作品! – 2012-03-01 20:49:50