|
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
|
|
Оптимизация ассемблерных программ арифметических операций15.02.2013, 01:34. Показов 8054. Ответов 14
Метки нет (Все метки)
Здесь будет приведено краткое изложение книги А.В. Максимова «Проектирование ассемблерных программ вычислительных алгоритмов». Книга вышла летом 2012 года. Оглавление этой книги приведено в А.В. Максимов Проектирование ассемблерных программ вычислительных алгоритмов
Как только упоминается слово оптимизация, тут же надо искать (или спрашивать) критерии оптимальности. В книге автор оптимизацию ассемблерных программ рассматривает с точки зрения (по критериям) достижения максимальной точности вычисления и минимального кода на исполнение. Стоит ли вообще рассматривать эту тему, ведь 32, 64 разряда плавающей запятой, более того, FPU, SSE обеспечивают очень высокую точность? Да стоит! FPU, SSE есть в процессорах с системой команд совместимой с Intel x86. Другие процессоры такой разви-той системы команд не имеют, а точность выполнения арифметических операций с чис-лами в формате плавающей запятой значительно ниже точности выполнения этих опера-ций с числами в формате с фиксированной запятой. Точность выполнения арифметиче-ской операции определяется числом разрядов мантиссы. В 32-х разрядных числах форма-та плавающей запятой мантисса занимает 24 разряда (см. стандарт IEEE 754), а в числах с фиксированной запятой – 31! Пусть в 16-ти разрядном процессоре самое максимальное значение переменной бу-дет 4000h (или 32768 в десятичной записи) с учетом знака. Это самый наихудший случай для представления в ЦВМ переменной, так как самый старший информационный разряд будет занимать только одно значение переменной, другие ее значения будут меньше. Пусть ошибка вычисления определяется тремя младшими разрядами. Тогда приведенная относительная погрешность составит: δ=(3/32768)*100%≈0,009% Нет необходимости доказывать, что если ошибка вычислений будет в 2-х или в 1-ом младшем разряде и/или, если, диапазон изменения переменной будет больше (в преде-ле переменная может быть 65535), то приведенная относительная погрешность буде зна-чительно меньше! Те, кто имели дело с электроизмерительными приборами (вольтметры, микроам-перметры и т.п.), по всей видимости, знают, что эти стрелочные приборы имеют классы точности. Так приборы, которые имеют класс точности 1.0, 0.5 и выше – считаются пре-цизионными (т.е особо точными). Как правило, прецизионные приборы имеют зеркаль-ную шкалу. Цифры 1.0, 0.5 на шкалах этих приборов означают класс точности и соответ-ствуют приведенной относительной погрешности этих приборов. С этой точки зрения даже 8-ми разрядные процессоры при определенных обстоятельствах могут быть преци-зионными устройствами! Изложение материалов книги будет в виде занятий. На занятие будут рассмотрены конкретные вопросы (или один вопрос). Далее небольшой перерыв для ответов на вопро-сы и обсуждения. Затем изложение нового материала. Занятие 1. Масштабирование числовых данных В обычной практике при записи чисел на бумаге предполагается, что нет ограничений на число информационных разрядов, их число бесконечно большое. Числа записываются со столькими разрядами, сколько необходимо для решения конкретной задачи. В ЦВМ число разрядов N, отводимых для записи данных с учетом их знака, является её важнейшим техническим параметром. Этот параметр имеет конкретное и ограниченное значение. Числа в ЦВМ будем представлять в виде следующего обобщенного графического изо-бражения, называемого форматом представления данных, форматом представления ма-шинной переменной (рисунок 1). [ATTACH]Вложение 234976[/ATTACH] Рис 1 Работая с разрядностью N, программист имеет возможность оперировать с 2N числом различных двоичных кодовых комбинаций. Понятно, что число кодовых комбинаций (число двоичных чисел) ограничено и с уменьшением разрядности ЦВМ уменьшается. Ограниченный диапазон изменения двоичных чисел в ЦВМ порождает при организации вычислительных алгоритмов проблему в установлении оптимального по точности и быстродействию соотношения между конкретными двоичными кодовыми комбинациями (двоичными числами) и конкретными значениями фактических (физических, математических) переменных, моделируемых этими алгоритмами. Проблема решается введением масштабирования данных вычислительного алгоритма. Определения процесса масштабирования и масштаба: Определение 1: Процесс приведения диапазона изменения истинной переменной к диапазону изменения машинной переменной называется масштабированием. Определение 2: Масштабом называется коэффициент приведения диапазона изменения истинной переменной к диапазону изменения машинной переменной. Математически масштабирование можно записать в виде следующего выражения: [ATTACH]Вложение 234981[/ATTACH] формула (1-а) Здесь X – истинная (физическая, математическая) переменная, [X] – машинное представ-ление истинной переменной (машинная переменная), Mx – масштаб переменной X. Для того, чтобы масштабирование можно было успешно применять во всем диапазоне изме-нения как истинной, так и машинной переменных, масштаб необходимо определять при наибольших значениях этих переменных, то есть Определения масштаба и масштабирования данных в ЦВМ полностью идентичны определениям масштабов и масштабированию в машиностроительном черчении, при построении географических карт и топологических планов. В уравнении (1) кроме масштаба Мх неизвестным является и [X]max . В самом деле, даже если нам известна разрядность представления данных в ЦВМ, то это еще не означает, что мы имеем возможность определить [X]max . Определить наибольшее значение машинной переменной можно в том случае, если известно положение машинной запятой, то есть определен формат машинной переменной. Решить уравнение (1) (назовем это решением задачи масштабирования) можно путем принудительного фиксирования одной из переменных: либо [X]max , либо Мх. В общем случае произвольная фиксация одной из неизвестной в уравнении с двумя неизвестными приводит к появлению семейства решений этого уравнения или к неоднозначности решения. В нашем случаи это неоднозначность решения задачи масштабирования в общем виде. При программировании вычислительных алгоритмов для ЦВМ с фиксированной запятой можно применять два метода решения задачи масштабирования: в первом фиксируется формат машинной переменной, во втором – масштаб. Ниже будет рассмотрен только метод фиксированного формата, так как этот метод получил наибольшее распространение в отечественной практике. При применении метода фиксированного формата программист фиксирует для всех переменных и констант вычислительного алгоритма положение машинной запятой в машинном формате данных. Возможны пять случаев фиксации положения машинной запятой, но наибольшее распространение получили два: так называемые дробная и целочисленная арифметики. На рисунке 2 показан формат машинных данных при использовании дробной арифметики: Все машинные числа в этой арифметике будут дробными. (Отсюда и название). На рисунке 3 приведен формат машинной переменной в целочисленной арифметике: В этом случае все машинные переменные будут целыми числами. Масштабы, определяемые по формуле (1) называются предельными. Предельные масштабы неудобны. Более практичнее – двоичные масштабы. (Вспомним в машиностроительном черчении ГОСТами определены строго определенные масштабы 1:2, 1:4, 2:1, 10:1, 1:10 и т.п. В географических картах – свои стандарты масштабов 1:50000, 1:1000, 1:1000000 и т.п) Для любого значения Xmax всегда можно найти такое целое mx, что будет справедливо неравенство где mx принято называть масштабным коэффициент. Масштабный коэффициент показывает сколько двоичных разрядов необходимо для представления целой части переменной с учетом представления ее максимального значения. Очевидно, что для дробной арифметике наибольшее машинное число определится как: [X]max = 1- 2^(-n) ≈ 1 (3) Приближенное равенство можно применять для n ≥ 7, при этом ошибка не превысит 1,5625%. Подставим в (1) наибольшее значение истинной переменной из правой части неравенства (2), а наибольшее значение машинной переменной из (3) получим формулу для масштаба в дробной арифметике: [ATTACH]Вложение 234984[/ATTACH] Формула (4) В целочисленной арифметике наибольшее значение машинной переменной определяется как [X]max = 2^(n) – 1 ≈ 2^n. И в этом случае приближенное равенство можно применять для n ≥ 7, и также ошибка не превысит 1,5625%. Используя последнее приближенное равенство и правую часть неравенства (3) получим формулу масштаба для целочисленной арифметике: [ATTACH]Вложение 234985[/ATTACH] Формула (5) В формулах (4) и (5) специально применены различные буквы для обозначения масштаба. Применение такого обозначения в дальнейшем позволит быстро определять тип арифметики, применяемой для решения конкретной задачи. Пример 1. Дано: разрядность ЦВМ N=8, наибольшее значение переменной Аmax=30,5, текущее значение переменной, подлежащее представлению в заданной ЦВМ, А=20,5. Решение: Примем целочисленную арифметику. Определим масштабный коэффициент ma для переменной А в соответствии с выражением (2): 2^4 <(или =) Аmax < 2^5 , откуда ma = 5. Определим по формуле (5) масштаб переменной А Ma = 2^(n-ma) = 2^(7-5) = 2^2 . По формуле (1-а) определим текущее машинное значение [А]: [А] = A * Ma = 20,5 * 2^2 = (2^4 + 2^2 + 2^(-1) ) *2^2 = 2^6 + 2^4 + 2^1 . В последнем выражении в скобках приведено разложение текущего значения А по целым степеням двойки. Вычислять сумму степеней двойки в машинном представлении [А] = 2^6 + 2^4 + 2^1 нет необходимости, так как запись в целых степенях двойки полностью соответствует формуле записи [А] в двоичной системе счисления. В случае нашего примера для целочисленной арифметики принимает вид: [А] = а6*2^6 + а5*2^5 + а4*2^4 + а3*2^3 + а2*2^2 + а1*2^1 + а0*2^0 . Очевидно, что значения коэффициентов а6=а4=а1=1, а коэффициентов а5=а3=а2=а0=0. Учитывая формат данных для целочисленной арифметики (смотри рис. 3), впишем единицы в разряды, веса которых соответствуют коэффициентам а6, а4, а1, а нули в разряды, веса которых соответствуют коэффициентам а0, а2, а3, а5. Получен-ный результат иллюстрирует рисунок 4: [ATTACH]Вложение 234986[/ATTACH] Рис. 4. В программных продуктах очень часто для ввода/вывода данных используют шестнадцатиричную форму записи данных. В нашем примере текущее машинное значение переменной в десятичной, двоичной и шестнадцатиричной формах записи будет иметь вид [А] =82d=01010010b=52h . В рассматренном примере текущее число 20,5 больше половины наибольшего значения переменной А (точнее больше чем (32:2)=16), следовательно в машинном представлении этого числа не должно быть свободных старших информационных разрядов. Это вывод подтверждается рисунком 4. Так как ma = 5, а масштабный коэффициент определяет число двоичных разрядов, отводимых для записи целой части машинной переменной, то положение истинной запятой в машинном формате будет между первым и вторым разрядами. Относительно положения истинной запятой в формате заданной ЦВМ по результату решения прямой задачи записано число 10010,10b=>20,5d, что является правильным результатам. Итак, на основании анализа результата тестового примера можно ут-верждать, что задача представления данных для переменной А решена правильно. В книге рассматриваются много примеров представления чисел в ЦВМ. Приводятся примеры решения обратной задачи – определения истинного значения переменной по ее машинному значению. На этих примерах останавливаться не будем из-за экономии места. Рассмотрим лишь пример представления дробей. Дано: n = 11, Хmax = 128, текущее значение переменной – Х =15,8. Определить машинное представление текущего значения переменной. Решение. Перевод из одной системы счисления в другую смешанного числа проводят в два этапа: отдельно переводят целую часть, отдельно дробную. В нашем случае представление целой части Х имеет вид 15,0d -> 1111,0b Переведем в двоичную систему дробную часть нашего числа по методике, изложенной в книге Соловьева Г.Н. «Арифметические устройства ЭВМ», издательство Энергия, 1978г. В этом случае необходимо дробь умножить на два. Если результат умножения не превысил 1, то первая значащая цифра двоичного представления дроби равна 0 и умножение повторяют до тех пор, пока результат превысит 1, записывая каждый раз нули в значащие цифры двоичного представления дроби. Как только результат превысил 1, то значащая цифра двоичного представления равна 1. Эту единицу вычитают из результата ум-ножения и продолжают умножение на 2 оставшейся дроби. Процесс повторяют до тех пор, пока не получат в остатке 0 или пока не выявится период, или достигнут желаемой точности. В нашем примере дробная часть равна 0,8. Рисунок 5 иллюстрирует перевода этой дроби в двоичную систему: [ATTACH]Вложение 234979[/ATTACH] Рис.5. Нетрудно заметить, что конечная дробь в десятичной системе трансформируется в периодическую в двоичной.!!! (Очень важно!) Таким образом, исходное текущее значение переменной Х в двоичной системе можно записать в виде Хd = 15,810 -> 1111,1100(1100)b . В нашем примере масштабный коэффициент в соответствии с (2) равен mx=8. Следовательно, для представления целой части переменной Х необходимо отвести 8 разрядов. Для представления дробной части остаются три разряда. На рисунке 6 представлено текущее значение Х в формате заданной ЦВМ. Из рисунка видно, что фактически в ЦВМ представлено число 15,75, а не 15,8 как необходимо. Полученная погрешность представления числа Х = 15,8, называется погрешностью оцифровки. Эту особенность необходимо учитывать при масштабировании сложных математических выражений. [ATTACH]Вложение 234980[/ATTACH] Рис. 6. В книге кроме понятия масштаба дается определение цене как величине обратной масштабу. Для дробной арифметике это цена машинной единицы, для целочисленной - цена младшего разряда. На этом изложение первой главы закончу. В следующей главе будут рассмотрены приемы оптимизации ассемблерных программ одиночных арифметических операций: сложения/вычитания, умножения, деления.
0
|
|
| 15.02.2013, 01:34 | |
|
Ответы с готовыми решениями:
14
А.В. Максимов Проектирование ассемблерных программ вычислительных алгоритмов Блок-схемы ассемблерных программ
|
|
Ушел с форума
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
|
|
| 15.02.2013, 04:40 | |
|
K_1212,
замечания по оформлению:
0
|
|
|
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
|
|
| 16.02.2013, 22:59 [ТС] | |
|
Прошу простить такую мою оплошность! В первый раз такой большой материал представляю здесь!
Хотел открыть новую тему с исправлениями, но потом решил исправиться. Все файлы вставил здесь. Mikl___ Спасибо за поддержку и полезные советы. Рисунок 1 Вложение 235517 Формула 1-а Вложение 235519 Формула 1-б Вложение 235520 Рисунок 2 Вложение 235521 Рисунок 3 Вложение 235522 Формула 2 Вложение 235523 Формула 4 Вложение 235524 Формула 5 Вложение 235525 Рисунок 4 Вложение 235529 Рисунок 5 Вложение 235530 Рисунок 6 Вложение 235531 Попробую набрать формулу (3)
0
|
|
|
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
|
|
| 16.02.2013, 23:20 [ТС] | |
|
Опять облом!!!!
Рисунок 1 Рисунок 2 Рисунок 3 Рисунок 4 Рисунок 5 Рисунок 6 Кажется рисунки вставились!!!! Формула 1-а Формула 1-б Формула 2 Формула 4 Формула 5 Ну вот исправился Формула (3) \left|X \right|max=1-{2}^{-n}\approx 1
1
|
|
|
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
|
|
| 16.02.2013, 23:31 [ТС] | |
|
Ну вот и опять облом!!!!
Формула не вставилась Формула (3) Беру тайм-аут на три дня для освоения редактора текста и формул. На вопросы готов отвечать.
0
|
|
|
Модератор
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,851
|
||
| 16.02.2013, 23:43 | ||
![]() 4000h это 16384 а 32768 это 8000h не может быть такого положительного числа для знаковых в 16 битах для безнаковых FFFFh=65535 максимальное для знаковых 7FFFh = 32767 максимальное положительное 8000h = -32768 минимальное отрицательное FFFFh=-1 максимальное отрицательное
1
|
||
|
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
|
|
| 20.02.2013, 01:07 [ТС] | |
|
Всем добрый вечер!
Пример состояния человека, удовлетворяющего поговорке: "Что такое не везет и как с ним бороться". Рисунки не вставляются, формулы не форматируются, расчеты экспромтом - с грубыми ошибками! ValeryS - Вы совершенно правы. Более того, в формуле приведенной относительной погрешности еще одна "плюха"! Предварительно оговорил значение ошибки в трех младших разрядах, а в формулу подставил число 3, когда должна стоять 7. Не убивайте, может еще пригожусь!? Все во власти всевышнего. Видимо не хочет он моего присутствия на форуме. Величина приведенной относительной погрешности должна иметь вид: Но даже после исправления вывод остается прежним: 16-ти разрядная ЦВМ может давать высокую точность арифметических операций!!! Занятие 2. Масштабирование операций сложение/вычитание С точки зрения процессора ЦВМ операции сложения и вычитания - эквивалентны. Поэтому масштабирование их проводится по одному правилу. Цели масштабирования операции сложения (или вычитания): а) Избежать переполнения: б) Выполнить операцию с максимальной точностью Напомню, переполнение - эффект в ЦВМ, когда, например, складываются два положительных числа, а сумма получается отрицательной. Под максимальной точностью будем понимать наличие в старшем информационном бите прямого кода переменной 1, когда переменная имеет максимальное значение. При выводе масштабных соотношений в рассматриваемом случае вводиться термин выравнивание масштабов. Действия, выполняемые по выравниванию масштабов чисел с фиксированной запятой, эквивалентны действиям, выполняемым при выравнивании порядков для сложения чисел в формате с плавающей запятой. Важно: коэффициенты выравнивания масштабов есть двойки в нулевой или отрицательной целой степени. Материалы этого занятия имеют много формул, рисунков, примеров. Боюсь опять сделать что-нибудь не так. Все материалы в файле Сложение.pdf. На странице 48 рисунок 2.2 - ошибка (техническая опечатка). Результат операции должен быть 01000011. Сложение.rar
1
|
|
|
Модератор
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,851
|
|||
| 20.02.2013, 01:37 | |||
![]() ближайший пример стрелочные часы к 11 часам прибавить 3 получим переполнение (результат 2)
0
|
|||
|
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
|
|
| 26.02.2013, 23:33 [ТС] | |
|
Занятие 3. Масштабирование операции умножения Методика вывода масштабных соотношенй одинакова для всех арифметических операций. Подробно разъясняется причина появления поправочных коэффициентов соответственно для дробной и целочисленной арифметик. Все особенности иллюстрируются примерами. Особо следует обратить внимание на повышение точности выполнения операции умножения. Запас по точности есть у каждой операции умножения. Этот запас как минимум один разряд, как максимум - два. Интересно заметить, что , например, фирма Analog Devices для повышения точности выполнения операции умножения в своих сигнальных процессорах типа Blackfin 536, 561 и др специально ввела как самостоятельную команду умножения со сдвигом произведения на один разряд влево. Так что этим советом целесообразно пользоваться!!! В книге не рассмотрено беззнаковое умножение (т.е. применение команда mul). Но используя методику книги можно быстро получить результаты и для этого случая. На форумах иногда встречаются "программисткие откровения" - способы замены умножения, например на число 3, сложением. Для этого множимое сдвигают на один разряд вправо и складывают результат сдвига с исходным значением. В книге показано как это делать для многих чисел. Еще раз обращаю внимание - практических примеров очень много. Желаю успехов в освоении материала! Умнож 1.pdf Умнож 2.pdf
1
|
|
|
Ушел с форума
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 04.03.2013, 06:55 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
K_1212,
замеченные опечатки и неточности:
0
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
|
|
| 05.03.2013, 23:11 [ТС] | |
|
Mikl___ !
Ваши замечания, комментарии, советы всегда приятно видеть: они лаконичные, аргументированы, четкие! По порядку замечаний: 1. Да, но я об этом недостатке говорил А.В. Максимов Проектирование ассемблерных программ вычислительных алгоритмов. 2. Да! Эту небрежность я не заметил! 3. Здесь Вы ошиблись. в книге все в порядке! Там идет речь об операции вычитания. Посмотрите внимательнее. 4. Разделю это замечание на две части. Первая Вы советуете применять выражение трех-операндная команда, вместо трех-адресная. Если подходить с точки зрения точности перевода "мануала" Intel, то Вы, несомненно, правы! Но если учитывать российско-советскую школу цифровой вычислительной техники, то она сформировала термин АДРЕСНОСТЬ команды процессора. Этот термин вошел в отраслевые стандарты, учебники, методики проектирования процессоров. (Адресность - технический параметор, подлежащий проектированию). С этой точки зрения, наверное, можно позволить автору употребить термин трех-адресная команда. Вторая часть - Вы абсолютно правы, в трех-операндной (трех-адресной) команде IMUL нельзя применять приемник и источник разрядности байт. Кроме источника в виде непосредственного числа.
0
|
|
|
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
|
||||||||||||||||||||||||||
| 09.03.2013, 23:15 [ТС] | ||||||||||||||||||||||||||
|
Занятие 4. Масштабирование операции деления. Операция деления самая сложная в математике и, как следствие, в аппаратной и программной реализациях. Как пример этому очень много вопросов на форумах программистов – «сваливается» программа деления, «деление на ноль – почему? Я делал все правильно, как учили, делил слово на байт!» и т.п. Очень часто дают советы типа: «такое деление в целых числах выполнять не целесообразно, всегда будет ноль в ответе, переходите на FPU». А на самом деле выполнить нормальное деление при указанных условиях можно! Практически на все подобные вопросы найдете ответы в подразделах книги 2.6 и 2.7 «Масштабирование операции деления» и «Особые случаи масштабирования операции деления» соответственно. В книге приводятся типовые варианты программ деления, которые можно использовать как шаблоны. Как всегда много практических примеров. Основное правило для программиста при реализации операции деления - частное не должно выходить за установленные разработчиком аппаратной части (в нашем случае Intel-ом) рамки в машинных целых числах: для байта – -128 или +127; для слова – - 32768 или + 32767; для двойного слова – - 2 141 483 648 или + 2 141 483 647 для квадрослова – - 9 223 372 036 854 775 808 или + 9 223 372 036 854 775 807. В этом смысле так и хочется подвергнуть критике пиаровское словоблудие в мануале Intel о делении слова на байт, двойного слова на слово, квадрослова на двойное слово и т.п. Но здесь этим заниматься не будем. Intel так организовал аппаратное деление, что требует числитель располагать в расширенном аккумуляторе: для байта это регистры AH:AL для слова DX:AX для двойного слова EDX:EAX для квадрослова RDX:RAX (Здесь: аккумулятор AL, AX, EAX, RAX; расширение аккумулятора - AH, DX, EDX, RDX.) При этом во всех битах расширителя аккумулятора должен быть знак числителя! Для облегчения программистам выполнять это условие Intel предусмотрел специальные команды копирования знака аккумулятора во все биты расширения: CBW (Convert Byte to Word) преобразовать байт в слово; CWD (Convert Doubleword to Quadword) преобразовать слово в двойное слово; CDQ (Convert Doubleword to Quadword) преобразовать двойное слово в квадрослово; CQO (Convert Quadword to OWord ) преобразовать квадрослово в восемь слов (OctavWord). Команды расширения обязательно должны применяться при программировании знакового деления. Их место в программе – перед командой IDIV. Если применяется беззнаковое деление (команда DIV) обязательно необходимо в расшерение загрузить ноль. Если эти условия выдерживать – команды IDIV и DIV будут выполняться безупречно во всем диапазоне изменения числителя одинарного формата (от 800…00h до 7FF…FFh), и во всем диапазоне изменения знаменателя независимо от значения числителя от 800…00h до 7FF…FFh, кроме 0h, естественно, и даже при 01h. При этом, возможны специфические случаи, когда истинные числитель и знаменатель не равны каждый независимо друг от друга нулю, при этом истинное частное, естественно, не равно нулю; для этого же случая машинные числитель и знаменатель независимо друг от друга не равны нулю, а машинное частное – равно нулю. Такой случай возникает тогда, когда машинный числитель в одинарной (первоначальной, нерасширенной) разрядности по абсолютной величине меньше машинного значения (одинарной разрядности) знаменателя. В любой позиционной системе счисления если 50/700 , то целая часть частного равно нулю. Дробная часть – 5/70, или 50 в остатке. Intel не дает возможности получать дробную часть частного, частное в аппаратном решении у него – одинарной разрядности и только старшая часть. (Вспомните, при умножении аппаратная часть дает программный доступ к полному произведению удвоенной разрядности!). Легко проверить (в книге это показано), что при полнодиапазонном изменениях числителя и знаменателя, независимо друг от друга, под частное необходимо, в идеальном случае, выделять удвоенную разрядность. А Intel в аппаратуре выделяет только старшую часть одинарной разрядности! Учитывая все сказанное становится понятным почему появляется «деление на ноль» и нецелесообразность выполнять некоторые операции деления в целых числах. Если заранее известно, что машинное значение знаменателя никогда не достигнет своего самого наименьшего значения 000…01h для положительных чисел или 0FF…FFh для отрицательных чисел, то можно повысить точность или даже реанимировать операцию деления за счет левого сдвига расширенного числителя на строго определенное число разрядов. В книге приводится методика расчета числа разрядов для повышения точности. Примеры. Здесь https://www.cyberforum.ru/asse... 98874.html участник форума попросил помочь вычислить значение выражения Пусть, для конкретности, А=3 и разрядность данных N=16. Результат вычислений равен 0,3. Если подходить к решению этой задачи не зная о методах повышения точности операции деления, получим следующую программу (пример 1):
Для отрицательного значения А (пусть оно будет А=-3) основное тело программы будет (пример 2):
Нетрудно заметить, что при реализации исходного выражения в программах, написанных как показано выше, при любых значениях А перед операцией деления машинный числитель всегда будет меньше машинного знаменателя. Это означает, что ответ всегда будет равен 0! То есть программа при реализации в целых числах не имеет смысла. Следовательно, сделаем вывод, необходим FPU! Не будем торопиться. Методика, предложенная в книге, весьма эффективна! Применим ее для рассматриваемого примера. Пусть А=-3, разрядность N=16. Выполним масштабирование: масштаб А=3 в целочисленной арифметике масштаб масштаб 1-цы коэффициент выравнивания масштаба 1-цы при ее сложении с Y1 масштаб знаменателя, то есть Y2=(Y1+1)=10 предварительная оценка масштаба частного Y3 = A/Y2, то есть результата (в книге предварительные масштабы помечаются звездочкой); фактический масштаб результата запас по точности при выполнении деления Основное тело программы будет иметь вид (пример 3):
частное в АХ – B334h; остаток в DX – C000h; истинное значение частного с учетом представления отрицательных чисел в дополнительном коде будет равно Пусть А=3, разрядность данных также 16. Выполним масштабирование: масштаб А-3 в целочисленной арифметике масштаб масштаб 1-цы коэффициент выравнивания масштаба 1-цы при ее сложении с Y1 масштаб знаменателя, то есть Y2=(Y1+1)=10 предварительная оценка масштаба частного Y3 = A/Y2 , то есть результата фактический масштаб результата запас по точности при выполнении деления Основное тело программы будет иметь вид (пример 4):
частное в АХ – 9999h остаток в DX - 6000h Истинное значение частного будет равно Если выполнять вычисления с разрядностью N=8, то для А=3 основное тело программы будет иметь вид:
Истинное значение частного в этом случае равно: Очевидно, что комментарии здесь излишни!!! Более интересным был бы пример программы, которая вычисляет значение функции допустим в интервале изменения аргумента Х от -6 до +6. Рассмотрим этот пример на следующем занятии. Напомню, что конечная дробь в одной позиционной системе счисления не обязательно будет конечной в другой. Конечная в десятичной системе счисления дробь 0,3d - в двоичной будет периодической 0,0(1001)b = 0,25+0,003125 + …. = 0,28125 + …. . В книге обнаружена еще неточность. На стр. 103 на восьмой строке снизу неправильная ссылка на рисунок: есть «рис. 2.29, ……», должно быть – «рис. 2.25, ….» В прилагаемых файлах: деление.pdf – скан соответствующего раздела книги; Pr4.doc – полный текст программы пяти примеров, рассмотренных выше с комментариями. Программа написана под MS DOS. Текст программы написан в виндовском Блокноте. Вложение 242121 Вложение 242119 Желаю всем успехов!
1
|
||||||||||||||||||||||||||
|
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
|
|
| 12.03.2013, 22:29 [ТС] | |
|
Повторю файл текста примеров, наверное опять не проходит.
Интересно, я этого не знал: не принимает один и тот же файл с расширением .DOC, но с измененным именем. Я хотел повторить вложение файла Pr4.doc - редактор не принимает. Изменил имя - не принимает и оба раза говорит, что я уже вложил этот файл. Я делаю что-то не так, как надо?!!
0
|
|
|
14 / 14 / 0
Регистрация: 25.01.2013
Сообщений: 35
|
||||||
| 16.03.2013, 23:28 [ТС] | ||||||
|
Добрый вечер всем!
Занятие 5 Масштабирование вычислительных процессов Заключительный раздел цитируемой книги полностью посвящен практическим примерам программирования вычислительных задач. Сформулирована методика, которая не требует комментариев. Методика содержит всего 5 пунктов и умещается на 2-х страницах. Далее весьма подробно разобраны примеры программирования вычисления полинома, синуса, разложенного в ряд Маклорена, решения простой системы дифференциальных уравнений. В пяти приложениях в книге представлены различные вспомогательные материалы, а также полные тексты программ, рассмотренных примеров. Здесь во вложении помещены копии последних разделов книги. Названия вложенных файлов соответствуют названиям подразделов книги. включить копии книги Полином.pdf Синус ряд Тейлора.pdf дифф уравнение.pdf приложения.pdf Попробуем применить методику книги для программирования функции из четвертого задания: Пусть аргумент Х изменяется от -6 до +6, а шаг его изменения примем 0,25. В книге рассматривается пример применения шага аргумента не кратного целой степени двойки типа 0,1, 0,05 и т.п.. Показано, что такое решение приводит к дополнительной, довольно значительной вычислительной ошибки. Поэтому в нашем примере будем применять шаг кратный целой степени двойки. В соответствии с пунктом 1 методики проведем анализ поведения нашей функции на всем интервале изменения аргумента, выявим ее экстремальные значения, а также экстремальные значения всех промежуточных переменных. Арифметический алгоритм вычисления нашей функции простой: Y1=X*X; Y2=Y1+1; Y=X/Y2. В файле Пример 1.xls в листе 1 приведены расчеты всех промежуточных переменных и самой функции, приведен график функции. Пример 1.xlsx Из этих расчетов определим максимальные значения переменных. Эти значения нам нужны будут для определения оптимальных масштабов переменных. Y1 - 36; Y2 - 37; Y - 0,5. Поскольку наименьшее по абсолютной величине значение переменной Y2 будет 1, то необходимо провести повышение точности выполнения операции деления. (В книге это вопрос рассмотрен в разделе масштабирование операции деления). Разумеется, повышать точность необходимо и после выполнения операции умножения. Для адекватного выполнения операции сложения 1 к Y1, необходимо выровнить ее масштаб представления под масштаб Y1. В соответствии с пунктом 2 методики выполним масштабирование последовательно всех операций арифметического алгоритма, начиная с первой. Результаты масштабирования сведены в таблицу - файл Сводная таблица.doc. Сводная таблица.doc В этой таблице приведен проект ассемблерной программы еще не оптимизированной (пункт 3 методики). Ниже приведен текст более-менее оптимизированный ассемблерной программы вычисления нашей функции. Программа специально написана под MS DOS, так как в этом случае выглядит очень компактно. Здесь были использованы TASM, Tlink и Turbo Debugger.
PRIM1.DOC Третий и четвертый столбцы - машинные значения X и Y, записанные как целые десятичные числа. Пятый и шестой столбцы - истинные значения аргумента и функции, полученные путем деления их машинных десятичных значений на соответствующие масштабы. Седьмой столбец – эталонное значение нашей функции, рассчитанное с помощью Excel. Восьмой столбец – ошибка вычисления заданной функции, которую дает наша программа. На том же втором листе приведены графики собственно рассчитанной функции и ошибки. Наибольшее значение относительной (относительной, но не приведенной) ошибки составляет чуть более 0,011%. Не забудьте - работали мы с шестнадцатью разрядами!!! Если внимательно посмотреть на второй столбец листа 2 файла Пример 1.xls, то можно отметить наибольшее значение вычисляемой функции Y = 4000h. Это говорит о достижении наивысшей точности представления этой переменной в машине, так как в старшем информационном разряде при максимальном значении переменной присутствует 1 и нет запаса по повышению точности!!! Аналогичную картину можно увидеть в пошаговом режиме в отладчике для переменных Y1 и Y2. Их машинные значения в экстремуме равны соответственно 4800h и 4A00h. То есть, и для этих переменных запас по точности представления в процессоре использован в полной мере! Вывод: методика работает нормально!!! На этом можно закончить! Если будут вопросы - попытаюсь дать ответ. Желаю успехов!
2
|
||||||
| 16.03.2013, 23:28 | |
|
Помогаю со студенческими работами здесь
15
Напечатать все знаки арифметических операций и операций отношения Вставить между цифрами 1, 2,..., 8, 9 в данном порядке, знак одной из 4-х арифметических операций так, чтобы результат восьми послед-х операций =100 Исследование арифметических операций Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1
У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\
А в самом низу файла-профиля. . .
|