Сравнение больших чисел

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Сравнение больших чисел

Сообщение Хакер » 06.03.2010 (Сб) 21:37

Код: Выделить всё
fo0$, bar@, baaz!, test#, kai%, boom&
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Сравнение больших чисел

Сообщение arthur2 » 06.03.2010 (Сб) 21:51

string, currency, single, double, integer, long
И? В чём ребус?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Сравнение больших чисел

Сообщение Хакер » 06.03.2010 (Сб) 21:57

В указывании 14% или 14&, вместо 14.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Сравнение больших чисел

Сообщение arthur2 » 06.03.2010 (Сб) 22:02

Почему тогда Const b14 As Byte = 14 тебе не нравится? Или я не догоняю, в чём косяк?

И что значит fo0, bar, baaz, , kai, boom?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Сравнение больших чисел

Сообщение Хакер » 06.03.2010 (Сб) 22:25

Потому что бессмысленная константа, когда можно было оботись Explicit-константой.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Сравнение больших чисел

Сообщение arthur2 » 06.03.2010 (Сб) 22:44

Слушай, объясни как тупому - что я из тебя каждое слово вытягиваю. Что такое Explicit-константа и как всё-таки нужно было бы сделать?

И вообще - принципиально-то подход правильный?
Артур
 
   

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Сравнение больших чисел

Сообщение iGrok » 07.03.2010 (Вс) 4:10

Explicit-константа = явная константа. То самое число с TDC. Ну нафига тебе создавать константу, если ты её используешь всего ОДИН раз?

Наверное, ещё можно заюзать PutMem1 и PutMem8 вместо CopyMemory.

Кстати, я не совсем понимаю смысл использования TDC. Мы же всё равно копируем один байт. А TDC для байта нет. Т.е. всё равно придётся объявлять минимум Integer, а 14 и без TDC - Integer. Нет?
label:
cli
jmp label

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Сравнение больших чисел

Сообщение arthur2 » 07.03.2010 (Вс) 7:14

iGrok Ну так ведь и было сначала :)
А константу я объявил, потому что Хакер разворчался, но не пояснил, почему, а только намякивал на эту 14. Именно потому и объявил, что знака для байта нетуньки - пытался догадаться, что ж таки не так :oops:
iGrok писал(а):Наверное, ещё можно заюзать PutMem1 и PutMem8 вместо CopyMemory.
Ну да, но это уже красатулинка (как и разборки с константой, как мне кажется). Я же про прЫнцип вопрошаю: есть тут грабли али нету?
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Сравнение больших чисел

Сообщение arthur2 » 07.03.2010 (Вс) 9:47

Возвращаясь к изначальной задачи - если нужно-таки просто сравнить, не вникая, что там за числа внутри:
Код: Выделить всё
'Помним, что раз числа беззнаковые, то отрицательные больше положительных, а самое большое -1
Do
    If H1 > H2 Then
'      если различаются знаком, то результат сравнение делаем обратным
       If (H1 < 0) Xor (H2 < 0) Then comp = -1 Else comp = 1
       Exit Do
    ElseIf H1 < H2 Then
       If (H1 < 0) Xor (H2 < 0) Then comp = 1 Else comp = -1
       Exit Do
    End If
' если не вышли из ду, значит верхние лонги равны и нужно сравнить нижние
    If L1 > L2 Then
       If (L1 < 0) Xor (L2 < 0) Then comp = -1 Else comp = 1
    ElseIf L1 < L2 Then
       If (L1 < 0) Xor (L2 < 0) Then comp = 1 Else comp = -1
    End If

Loop While 0
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Сравнение больших чисел

Сообщение Хакер » 07.03.2010 (Вс) 13:30

Кстати, я не совсем понимаю смысл использования TDC. Мы же всё равно копируем один байт. А TDC для байта нет. Т.е. всё равно придётся объявлять минимум Integer, а 14 и без TDC - Integer. Нет?

Нет, по умолчанию число имеет тип Variant. Соответственно, чудо, что оно вообще работает.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Сравнение больших чисел

Сообщение arthur2 » 07.03.2010 (Вс) 16:04

хм... а я, кстати, всегда думал как iGrok :oops: А с чего бы компилятору выделять под константу лишние байты, если она однозначно не будет меняться?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Сравнение больших чисел

Сообщение Хакер » 07.03.2010 (Вс) 16:19

Не понял про лишние байты и изменение. Можешь пояснить?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Сравнение больших чисел

Сообщение arthur2 » 07.03.2010 (Вс) 19:24

Если константа 14 без закорючки - variant, значит должна занимать 16 байт. Хотя влазит в один.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Сравнение больших чисел

Сообщение Хакер » 07.03.2010 (Вс) 19:26

Мало ли кто во что влазит. Все сущности по умолчанию имеют тип Variant, если иное не указано DefXXX-ключевым-словом.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Сравнение больших чисел

Сообщение arthur2 » 07.03.2010 (Вс) 19:50

То есть, константа 14 будет занимать 16 байт? При том, что заранее понятно, что все остальные байты никогда задействованы не будут? По-моему, очень нерационально так компилировать. Неужели бейсик такие вещи не оптимизирует?

Код: Выделить всё
  Dim b(15) As Byte
  CopyMemory b(0), -1, 16
  Stop' смотрим, что накопировалось в массив

Какой тип в этом случае -1?
Первые два байта, как и предполагалось, 255, остальные - когда как (видимо, какой-то мусор). Значит, всё-таки, integer? Или я чего-то недопонимаю?

Код: Выделить всё
  Dim b(15) As Byte
  Const v As Variant = -1
  CopyMemory b(0), v, 16
  Stop

Опять 255 - только два байта, но - восьмой и девятый. А нулевой байт - 2 (на сколько я понял - признак подтипа integer) и на этот раз никакой мусор не появляется.
Артур
 
   

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Сравнение больших чисел

Сообщение iGrok » 08.03.2010 (Пн) 1:40

Вот и я думаю, что как-то это странно, константы вариантом по умолчанию объявлять.
Переменные - тут всё понятно. Но константы, значение которых известно на этапе компиляции, и не может изменяться.. Нерационально это как-то.

Или всё-таки так оно и есть, а то, что получилось у arthur2 - это просто компилятор "случайно" "прооптимизировал" выражение?
label:
cli
jmp label

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Сравнение больших чисел

Сообщение arthur2 » 08.03.2010 (Пн) 6:03

iGrok писал(а):Или всё-таки так оно и есть, а то, что получилось у arthur2 - это просто компилятор "случайно" "прооптимизировал" выражение?

См. мой предыдущий пост - я же провёл эксперимент, чтобы проверить это предположение.

Если бы 14 был вариантом, скопировалось бы не 14, а 2 - такие дела :)

Хакеру я привык доверять - может я просто чего-то не так понимаю... но своим глазам я тоже привык доверять. Хотелось бы пояснений... Может, бейсик "оптимизирует" это при передаче в АПИ? Всё равно непонятно - почему бы не оптимизировать заранее.

Пишу i=&HF% бейсик сам стирает TDC. Рискну предположить: потому, что &HF и без того integer
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Сравнение больших чисел

Сообщение Хакер » 08.03.2010 (Пн) 8:19

И правда Integer. А сервис-паки стоят?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Сравнение больших чисел

Сообщение Mikle » 08.03.2010 (Пн) 9:27

Переменные по умолчанию - Variant, целые константы от -32768 до 32767 - Integer, бОльшие - Long, дробные без явного "!" - Double.
Это и с сервиспаками, и без, и проверяется проще:
Код: Выделить всё
  Dim x As Variant, y As Variant
  x = 30000
  y = 30000
  Caption = x + y

Это работает, а "Caption = 30000 + 30000" вызовет переполнение.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Сравнение больших чисел

Сообщение Хакер » 08.03.2010 (Пн) 10:21

Это известно.

Я точно помню случай, когда ByRef As Any съел Variant-ную константу.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 39

    TopList