|
|
| Посл.отвђт | Сообщен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 - это тоже число, записаное в шеснадцатиричной системе счисления. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.053 |