На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> Получить остаток от деления
    В 8-байтовом массиве bNum(0 to 7) лежит некое 64-битное число (bNum(0)-младший байт, bNum(7)-старший). Нужно разделить его на положительный Long и получить остаток от деления в Long (<=2^31-1). Как сделать это максимально быстро?
      А что. 64-разрядные целые недоступны?

      Если только 32-разрядные:

      Эти 8 байт содержат 64-битное число, которое состоит из старшей H и младшей L части, делитель D. Делить можно точно так же, как мы в десятичной системе делим уголком двузначное число HL на однозначное D - сначала первую цифру делим, сносим остаток ко второй, вторую делим - остаётся остаток.

      ExpandedWrap disabled
             Rem = H mod D
             FirstDigit = H div D
             L = L + Rem
             SecondDigit = L div D
             Remainder = L mod D


      div и mod - целочисленные деление и остаток от деления.
      Сообщение отредактировано: MBo -
        На вскидку:
        ExpandedWrap disabled
          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
          Цитата MBo @
          А что. 64-разрядные целые недоступны?

          что имеется ввиду? Currency? Думал, что из-за его фиксированного вещественного формата 8-ми байтовое целое явно в него не влезет, что там получится в результате... Немного проанализировав процесс, допускаю, что всё будет в норме в коде Mikle для положительного 64битного знакового.

          MBo вы забываете, что при разбиении 64-го на 2 Long в них может появиться знак, и результат будет не тот:
          CopyMemory l1, b(0), 4
          CopyMemory h1, b(4), 4
          Сообщение отредактировано: BlackSun -
            Mikle
            Что касается CLng(((c1 / c2) - Int(c1 / c2)) * c2 * 10000):

            а не получим ли мы иногда неверный результат из-за потерь точности на (c1 / c2) - Int(c1 / c2)?
            Сообщение отредактировано: BlackSun -
              В самом типе Currency число хранится как 64-х битное целое, без форматирования, как в Double, при расчётах только делится на 10000?
                Цитата BlackSun @
                число хранится как 64-х битное целое, без форматирования, как в Double

                Double - это не как 64-х битное целое. Currency хранится как int64 со знаком, и да, делится на 10000.
                Сообщение отредактировано: Mikle -
                  Цитата Mikle @
                  Double - это не как 64-х битное целое

                  я в курсе
                     
                     
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script Execution time: 0,1063 ]   [ 18 queries used ]   [ Generated: 16.06.19, 08:44 GMT ]