Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.225.209.95] |
|
Сообщ.
#1
,
|
|
|
В 8-байтовом массиве bNum(0 to 7) лежит некое 64-битное число (bNum(0)-младший байт, bNum(7)-старший). Нужно разделить его на положительный Long и получить остаток от деления в Long (<=2^31-1). Как сделать это максимально быстро?
|
Сообщ.
#2
,
|
|
|
А что. 64-разрядные целые недоступны?
Если только 32-разрядные: Эти 8 байт содержат 64-битное число, которое состоит из старшей H и младшей L части, делитель D. Делить можно точно так же, как мы в десятичной системе делим уголком двузначное число HL на однозначное D - сначала первую цифру делим, сносим остаток ко второй, вторую делим - остаётся остаток. Rem = H mod D FirstDigit = H div D L = L + Rem SecondDigit = L div D Remainder = L mod D div и mod - целочисленные деление и остаток от деления. |
Сообщ.
#3
,
|
|
|
На вскидку:
Option Explicit Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Dim b(7) As Byte, L As Long, c1 As Currency, c2 As Currency Private Sub Form_Load() 'Делимое b(0) = &H80 b(1) = 0 b(2) = &H3 b(3) = 0 b(4) = 0 b(5) = 1 b(6) = 7 b(7) = 28 'Делитель L = &H10000 CopyMemory c1, b(0), 8 CopyMemory c2, L, 4 MsgBox CLng(((c1 / c2) - Int(c1 / c2)) * c2 * 10000) End Sub |
Сообщ.
#4
,
|
|
|
Цитата MBo @ А что. 64-разрядные целые недоступны? что имеется ввиду? Currency? Думал, что из-за его фиксированного вещественного формата 8-ми байтовое целое явно в него не влезет, что там получится в результате... Немного проанализировав процесс, допускаю, что всё будет в норме в коде Mikle для положительного 64битного знакового. MBo вы забываете, что при разбиении 64-го на 2 Long в них может появиться знак, и результат будет не тот: CopyMemory l1, b(0), 4 CopyMemory h1, b(4), 4 |
Сообщ.
#5
,
|
|
|
Mikle
Что касается CLng(((c1 / c2) - Int(c1 / c2)) * c2 * 10000): а не получим ли мы иногда неверный результат из-за потерь точности на (c1 / c2) - Int(c1 / c2)? |
Сообщ.
#6
,
|
|
|
В самом типе Currency число хранится как 64-х битное целое, без форматирования, как в Double, при расчётах только делится на 10000?
|
Сообщ.
#7
,
|
|
|
Цитата BlackSun @ число хранится как 64-х битное целое, без форматирования, как в Double Double - это не как 64-х битное целое. Currency хранится как int64 со знаком, и да, делится на 10000. |
Сообщ.
#8
,
|
|
|
Цитата Mikle @ Double - это не как 64-х битное целое я в курсе |
Сообщ.
#9
,
|
|
|