UInt64 становится сомнительным, делая большую математику? - PullRequest
4 голосов
/ 02 марта 2012

У меня странный результат, полученный от какой-то большой математики, и я понятия не имею, почему я получаю другой ответ от vb.net против питона.

Вот быстрые фрагменты и результаты:

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 совпадают в обоих отладчиках - !!??

Есть идеи?= + Мои благодарности

Выдающийся Джон - очень красноречивый, и это работает!Не могли бы вы предложить несколько исправлений для финальной части?Я верю, что происходит то же самое, даже если вы исправили мою проблему:)

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

1 Ответ

4 голосов
/ 02 марта 2012

Я декомпилировал ваш VB-код как C #, и он выглядит следующим образом:

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

Это потому, что оператор power в VB всегда возвращает Double:

Результатом является число, возведенное в степень экспоненты, всегда в виде значения Double.

Я бы предложил использовать оператор сдвига и сделать все ваши переменные UInt64, так что смещение выполняется от до 64-разрядного целого числа:

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

Это дает правильный ответ.(На самом деле вам не нужно LSB, чтобы быть UInt64, но вы также можете сделать все с 64-битными целыми числами.)

...