· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› Выполнимо ли условие?

<< . 1 . 2 . 3 . >>

Посл.отвђт Сообщенiе


Дата: Авг 16, 2004 11:27:31 · Поправил: letopisec

cresta

типа 3221225525 десятичное = C0000035h шеснадцатиричное

в еах грузим 3221225525, если оно 16тиричное, то в еах оно явно не поместится, вывод - оно 10тичное. А следовательно cresta тебя интересует именно „C0000035h“

>1) Eсть y=(2^32-1)*sin(x)

Положим sin(x) = 1 => y = FFFFFFFF
Теперь sin(x) = -1 => y = 100000001

Не настораживает что в последнем примере число 33-х разрядное?


Дата: Авг 16, 2004 11:28:16 · Поправил: letopisec

ну а раз провакация ;)... я умываю руки


Дата: Авг 16, 2004 11:40:03 · Поправил: q_q

cresta
Как правильно сравнить y и a ?
Для начала сократить общий множитель.


Дата: Авг 16, 2004 13:29:13

letopisec
Подожди умывать руки :)

Теперь sin(x) = -1 => y = 100000001
Не настораживает что в последнем примере число 33-х разрядное?“

С какой это радости при х=-1 y получается 33-х разрядным???
Y= 4294967295 *(-1)= -4294967295, или чтобы в разрядах: -2^32-1

q_q
„Для начала сократить общий множитель“

Народ, вы не уходите от ответа :). Случай
y=M*sin(x), и a=N*cos(b). Где M<>N , и M и N -простые числа (или взаимно простые числа) в диапазоне от 2^31 до 2^32-1. Как сравнить y и a если общего множителя нет?
Или вот такой пример:переменная y в результате некоторых вычислений приняла значение 4294967295, переменная a в результате вычислений приняла значение -1
    mov eax,y
    mov eсx,a
    cmp eax,ecx
    je @Equ

И программа переходит на @Equ, хотя 4294967295 <> -1.
Предвижу ответ, что я не уложился в диапазон –2147483648...+2147483647. Как узнать, что я не укладываюсь в диапазон и результат вычисления - большое положительное число а не маленькое отрицательное и мне надо переключиться на другой алгоритм проверки? Флаги мне в этом никак не помогают.


Дата: Авг 16, 2004 14:10:12 · Поправил: letopisec

„С какой это радости при х=-1 y получается 33-х разрядным???
Y= 4294967295 *(-1)= -4294967295, или чтобы в разрядах: -2^32-1 “


-2^32-1 - это 32 разряда на значение + 1 на знак. Итого: 33

„Или вот такой пример:переменная y в результате некоторых вычислений приняла значение 4294967295, переменная a в результате вычислений приняла значение -1 “

А чем отличается представление 4294967295(32-х разрядное знаковое) от -1(32-х разрядное знаковое)?


Дата: Авг 16, 2004 15:53:05

cresta
Лучше всего использовать тип соответствующий диапазону вычислений.

Например sin (pi / 4) как будет представлен при целочисленных вычислениях???

Любой программист должен знать область определения и область значений используемых функций, исходя из этого выбирать тип данных. А если заранее неизвестна размерность или - она бесконечна :) где-то уже задавали вопрос как перемножить оччень большие целые числа...


Дата: Авг 16, 2004 17:09:36

> „А во вторых
test ecx,ecx - это проверка на 0, а не отрицательность. “


Команда test это не проверка, а арифметическое действие - пибитовое И.
Т.к. флаг S всегда равен старшему биту результата, то последующее JS будет выполняться, если старший бит числа = 1.

Как интерпретировать это число - это наше дало, можно его рассматривать как signed, так и unsigned.
Это происходит во время компиляции.
Если же необходимо проверить тип числа в runtime, то
необходимо выделить ещё один (дополнительный) бит - признек тапа.
Его нет в примере cresta - отсюда все проблемы.
Runtime информация о типе доступна в некоторых HLL.
При использовании ассемблера как правило информация о типе операндов кодируется в инструкциях их обрабатывающих.

Вот ещё код для медитации:

00 00 00 00

Что это? Один DWORD или четыре BYTE?


Дата: Авг 16, 2004 17:31:51

„Команда test это не проверка, а арифметическое действие - пибитовое И.
Т.к. флаг S всегда равен старшему биту результата, то последующее JS будет выполняться, если старший бит числа = 1. “


Спасибо за поправку. Только начинаю разбиратсья


Дата: Авг 16, 2004 18:50:46

„Команда test это не проверка, а арифметическое действие - пибитовое И.
Т.к. флаг S всегда равен старшему биту результата, то последующее JS будет выполняться, если старший бит числа = 1. “


Если уж быть совсем точным, то команда test выполняет логическую операцию И, причем затрагиваются только флаги, а операнды остаются без изменения. Этим она и "вкусна", собственно.


Дата: Авг 16, 2004 19:32:49

letopisec

Вообще-то ты был прав :). Наполовину только.
test ecx,ecx дейчтвительно делает проверку на ноль.
Если ecx = 0, то в результате будет установлен флаг ZF.
Соответственно последующая JZ (или, что то же самое, JE) будет выполняться если ecx = 0.

Опять же смысл здесь в том, какой(ие) именно флаг(и) анализируется после арифметический (или это логическая? я не уверен =) команды.

Вот для примера ещё несколько способов проверки на 0:
and  ecx,ecx  ; тоже что и тест, но результат операции сохраняется в ecx.
JZ   zero

and  ecx,-1
JZ   zero

or   ecx,ecx
JZ   zero

or   ecx,0
JZ   zero

xor  ecx,0
JZ   zero

inc  ecx
dec  ecx
JZ   zero

cmp  ecx,0
JZ   zero

cmp  ecx,1
JC   zero

sub  ecx,1
JC   zero

add  ecx,-1
JNC  zero

add  ecx,ecx
JA   zero ; (ZF=0 и CF=0)

not  ecx
inc  ecx
JZ   zero

neg  ecx
JNC  zero

5 последних меняют регистр, но иногда это полезно.
Для проверки обычно использубтся test или cmp т.к. результат этих операций не сохраняется, т.о. они быстрее.


Дата: Авг 16, 2004 19:56:06

letopisec
„-2^32-1 - это 32 разряда на значение + 1 на знак. Итого: 33“

Пожалуйста, не путай теплое и мягкое. Я говорю о числах, а не о их представлениях. 2^32-1 - это число, FFFFFFFF - его представление. У числа -1 такое же представление. Т.е. если к примеру, пользователь ввел с клавиатуры два разных числа(4294967295 и -1, которые в его представлении - отрицательное и положительное, ведь он может и не знать такого извращенства, как знаковое/беззнаковое) то я смогу определить, какое число было введено, только через подсчет количества нажатых клавиш? Больше или меньше определенного количества символов. Т.е. надо либо наблюдать процесс появления представления числа, либо переходить к большей разрядности. Обратная задача - только по представлению числа однозначно получить само число - нерешаема. Я так понял.

S_T_A_S_

„Как интерпретировать это число “
Наверное, правильнее сказать "как интерпретировать представление числа"
Что касается кода для медитации, то в нормальном понимании это ноль. Его можно назвать двордом, 4-мя байтами или назвать носорогом, неважно. Главное, чтобы носорог вел себя как ноль, а не норовил при случае удрать в саванну.


Дата: Авг 16, 2004 21:19:15

cresta > „Наверное, правильнее сказать "как интерпретировать представление числа" “

Возможно, у меня плохо с терминологией :).


> „Что касается кода для медитации, то в нормальном понимании это ноль.“

Почему же это ноль? Если посмотреть страницу из браузера в hex редактроре, то будет:
30h,30h,20h,30h,30h,20h,30h,30h,20h,30h,30h

imho определённо сказать что это за данные можно только в каком-то конкретном контексте.
Алгоритмы всегда связанны с данными. Это фундаментальное понятие. Как Yin & Yang :).


Дата: Авг 16, 2004 22:05:13

S_T_A_S_

Последовательность нулей вполне может оказаться куском файла .bmp, просматриваемого в Notepad. Файла с изображением носогора. Почему бы и нет? Хотя это уже другая история.


Дата: Авг 16, 2004 23:26:04

cresta

Нет, это не другая история.
Тот же .bmp файл выглядит по разному, в зависимости от программы, которой его открываем (читай: алгоритма обработки)
Сами по себе абстрактные данные - это ничто.


Дата: Авг 17, 2004 06:51:44 · Поправил: letopisec

„Пожалуйста, не путай теплое и мягкое. Я говорю о числах, а не о их представлениях. 2^32-1 - это число, FFFFFFFF - его представление. У числа -1 такое же представление“

Нет cresta, ты не прав. Я где-то вычитал что "-1" это не FFFFFFFF, а FF ;).

и кста, FFFFFFFF - это тоже число, записаное в шеснадцатиричной системе счисления.

<< . 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.053