|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Sashka Yackubtchick 2:5054/29.54 04 Dec 2001 06:20:13 To : Alexey Gradovtsev Subject : максимум двух чисел без сравнения -------------------------------------------------------------------------------- 03 Dec 01 21:50, Alexey Gradovtsev писАл(а) к Andrew Ezhguroff: AG> Приветствую тебя, о Andrew всем Andrewам! AG> Andrew Ezhguroff в письме к Alexey Gradovtsev от 02 декабря 2001 г., 05:44 AG> писал: >>> А для общего случая вещественных чисел можно что-то придумать? >>> Просто уже интересно стало. AE>> В вещественных еще проще (во всяком случае на IBM-PC): достаточно AE>> обнулить знаковый бит. AG> А каков их полный формат? Видимо имеется ввиду формат IEEE. Тут автор письма несколько туманно обошёл сложности в контексте работы с данным форматом с целью сабжа. Дело в том что непосредственно работая с этим форматом в FPU нельзя использовать стандартные для целочисленных команд и регистров логические команды AND и OR которые обычно применяются для установки и обнуления бита. Это сделано специально для того чтобы можно было избежать ненармолизованого формата, использование которого приведёт к исключению в FPU. Hо, в FPU можно просто вызвать команду fabs которая преобразует значение в регистре в абсолютное. Можно конечно обнулить бит и непосредственно в памяти, но если нам нужно вернуть MAX не изменив сами переменные то в данном случае мы нарушим это условие. Возможно уже много слов напечатано а смысл ускальзает :) Попробуем пояснить на примере. Допустим мы хотим найти сабж в целочисленом типе, для этого нам нужно было бы загрузить переменные в регистры получить их abs и потом проделать еще арифметические операции над ними чтобы получить max. Если бы достаточно было обнулить какой-то бит то все было бы ОК. Мы обнулили бы его в регистре, проделали бы операции и вернули max. Hо в целочисленых типах и регистрах этого недостаточно, хотя обнулить бит просто мы не получим abs значения таким образом. Сейчас пусть этого достаточно в формате IEEE. Hо мы не можем этого сделать непосредственно в регистре сопроцессора. Получается мы можем сделать это только в памяти, но тогда мы "испортим" переменную. Получается что мы должны будем создать две временные переменные, загрузить в них реальные переменные (это одной командой неполучится, конкретная скорость такого перемещения будет зависить от размера вещественого типа - он может быть от 4х до 10и байт). Только после этого мы можем во временых переменных обнулить байт и загрузить их в FPU для последующих операций. С другой стороны в реальной жизни делать это с веществеными типами не нужно - все известные мне сопроцессоры имеют команду abs которая как раз этим и занимается. Теперь по поводу формата. Он не такой уж и простой :) Hесмотря на то что знак действительно определяется одним битом, он куда сложнее представления целочисленого. Короткое вещественное (32 бита): ------------------------------- (нумерование битов начиная с нулевого - самый младший 0 старший - 31) Бит 31 - знак мантиссы, биты 30-23 - 8ми битная экспонанта (+127), биты с 22го по нулевой - 23х битная мантисса без первой цифры. Длинное вещественное(64 бита): --------------------- Бит 63 - знак мантиссы, биты 62-52 - 11и битная экспонанта (+1024), биты 51-0 52х битная мантисса без первой цифры. Расширенное вещественное(80 бит): --------------------------------- бит 79 - знак мантиссы. 78-64 - 15ти битная экспонанта(+16 383) 63-0 - 64х битная мантисса с первой цифрой (первая всегда равна 1 значит 63ий бит всегда равен одному) Чувствую что несколько сумбурно объяснил :) Hо боюсь если перепешу еще хуже будет. Пока! Sashka, The Svin. --- GoldED/W32 3.00.Beta1+ * Origin: Svin, Perm, Russia (2:5054/29.54) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/33843c0c655a.html, оценка из 5, голосов 10
|