На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное 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.
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Сравнение больших чисел
    В структуре размер файла хранится в двух полях:

    ExpandedWrap disabled
      nFileSizeHigh as long
      nFileSizeLow as long


    Как это дело перевести, скажем в double, чтобы сравнивать привычными больше-меньше? Или нужен какой-то другой подход?
      Сравнивается тремя ифами
        ANDLLНу не томи, поясни :)
          ExpandedWrap disabled
            function compare(a as xlong, b as xlong) as integer
            compare=sgn(a.high-b.high)
            if compare=0 then compare=sgn(a.low-b.low)
            end function
            Akina
            Спасибо! То что надо :D
            А как бы ещё этот xlong перевести в более привычный вид? И какой тип выбрать? дабла ведь не хватит... Может, в вариант?

            Скажем, 10 гигов записать xlong-ом? узнать по xlong-у, сколько это гигов?
              Ты вообще представляешь что эти два члена в структуре "символизируют"?
                ANDLLЯ представляю :) Но именно что представляю - без подробностей, потому и спрашиваю.

                На сколько я понимаю, оба поля ведь беззнаковые? А раз беззнаковых лонгов в бейсике нет, то отрицательные - больше положительных, и самое большое, которое влазит в лонг - минус 1. То есть &Hffffffff - самое большое число, которое можно записать в один лонг (нужно ещё держать в уме, что на самом деле оно не отрицательное). Прибавляем единичку - получаем переполнение лонга в верхний лонг: &h100000000 и так далее до &hffffffffffffffff

                Теоретически это понимая, мне очень сложно абстагироваться, я запутываюсь - хочется оперировать привычными десятичными числами без ограничения числа знаков :)
                  Ясно
                  А какова все же цель? Нужно (с потерей данных) преобразовать в double или в string(например что бы пользователю показать) но без потерь?

                  Добавлено
                  А впрочем пофиг, все равно в три строчки не получается

                  Добавлено
                  Цитата Артур @

                  На сколько я понимаю, оба поля ведь беззнаковые? А раз беззнаковых лонгов в бейсике нет, то отрицательные - больше положительных, и самое большое, которое влазит в лонг - минус 1. То есть &Hffffffff - самое большое число, которое можно записать в один лонг (нужно ещё держать в уме, что на самом деле оно не отрицательное). Прибавляем единичку - получаем переполнение лонга в верхний лонг: &h100000000 и так далее до &hffffffffffffffff

                  я бы сделал так:

                  function ltod(byval x as long) as double
                  if x < 0 then
                  ltod = 2#^32 +cdbl(x)
                  else
                  ltod = x
                  endif
                  end func

                  function lltod(high as long, low as long) as double
                  lltod = ltod(high) * (2#^32) + ltod(low)
                  end function
                    В функцию нужно передать минимум и максимум, а вернуть - принадлежит ли размер этому диапазону. Предполагаю определить аргументы минимум и максимум как вариант, ведь:

                    Цитата
                    Переменные типа Decimal сохраняются как 96-разрядные (12-байт) целые без знака, масштабируемые степенями 10. Степень масштабирования определяет число знаков дробной части, которое может изменяться от 0 до 28. Для степени масштабирования 0 (числа без дробной части), максимальными по абсолютной величине значениями являются +/-79 228 162 514 264 337 593 543 950 335. При 28 знаках дробной части максимальными по абсолютной величине значениями являются +/-7,9228162514264337593543950335, а минимальными +/-0,0000000000000000000000000001.

                    Примечание. В настоящее время поддерживается использование типа данных Decimal только в пределах типа Variant, т.е. невозможно описать переменную с типом Decimal. Пользователь, однако, имеет возможность создать переменную типа Variant с подтипом Decimal с помощью функции CDec.

                    но что-то как то смутно понимаю смысл этой цитаты :blush: Не говоря уже о том, чтобы перевести введенное число в xLong

                    Или я не туда рою?
                      Если нужно вернуть принадлежит ли диапазону то чем мешает функция в посте номер 3?
                        Цитата ANDLL @
                        ExpandedWrap disabled
                          function lltod(high as long, low as long) as double
                          lltod = ltod(high) * (2#^32) + ltod(low)
                          end function


                        Цитата ANDLL @
                        Нужно (с потерей данных) преобразовать в double?

                        А на каком размере начнётся потеря, не могу сообразить? Где-нибудь далеко за террабайты и этим можно пока пренебречь за неимением файлов таких размеров? Или потери начнутся раньше?
                          Проверь сам
                          for i = 0....
                            Цитата ANDLL @
                            Если нужно вернуть принадлежит ли диапазону то чем мешает функция в посте номер 3?

                            Тем, что в аргумент нужно будет передавать уже xlong, а хотелось бы что-то более привычное То есть, передавать-то можно как раз xlong, но этот ХЛонг нужно сначала получить. Скажем, 10 гигов - это сколько в ХЛонге?
                              6, 0
                                Ну способ "в лоб":
                                ExpandedWrap disabled
                                  Declare Function CopyMemory Lib "kernel32" (dst As Any, src As Any, ByVal length As Long)
                                   
                                  Function Compare(n1 As LARGE_INTEGER, n2 As LARGE_INTEGER)
                                  Dim b1() As Long, b2() As Long, i As Long
                                  Redim b1(0 To Len(n1)), b2(0 To Len(n2))
                                  CopyMemory b1(0), n1, Len(n1)
                                  CopyMemory b2(0), n2, Len(n2)
                                   
                                  For i = 0 To Len(n1)
                                  Compare = Sgn(b1(i) - b2(i))
                                  If Compare <> 0 Then Exit Function
                                  Next
                                  End Function


                                ох уж этот Бэйсик...
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0356 ]   [ 15 queries used ]   [ Generated: 3.07.25, 20:58 GMT ]