Элемент процессора выполняющий действия над числами с плавающей запятой это
Плавающая запятая — форма представления действительных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Наиболее часто используемое представление утверждено в стандарте IEEE 754. Реализация математических операций с числами с плавающей запятой в вычислительных системах может быть как аппаратная, так и программная.
Содержание
В 1954 году IBM 704 имела арифметику с плавающей запятой в качестве стандартной функции, что было одним из ее основных улучшений по сравнению с предшественником IBM 701 . Это было перенесено на его преемников 709, 7090 и 7094.
В 1963 году Digital анонсировала PDP-6 , в которой плавающая точка была стандартной функцией. [4]
В 1963 году GE-235 был оснащен «вспомогательным арифметическим устройством» для вычислений с плавающей запятой и двойной точности. [5]
Исторически сложилось так, что в некоторых системах с плавающей запятой использовался сопроцессор, а не интегрированный блок (но теперь в дополнение к ЦП, например, графические процессоры, которые являются сопроцессорами, не всегда встроенными в ЦП, как правило, имеют FPU, тогда как первые поколения графических процессоров не имеют т). Это может быть отдельная интегральная схема , вся печатная плата или шкаф. Там, где оборудование для вычислений с плавающей запятой не было предоставлено, вычисления с плавающей запятой выполняются программно, что требует больше процессорного времени, но позволяет избежать затрат на дополнительное оборудование. Для конкретной компьютерной архитектуры инструкции с плавающей запятой могут быть эмулированы библиотекой программных функций; это может позволить запускать один и тот же объектный код в системах с оборудованием с плавающей запятой или без него. Эмуляция может быть реализована на любом из нескольких уровней: в ЦП в виде микрокода (что не является обычной практикой), в качестве функции операционной системы или в коде пользовательского пространства . Когда доступны только целочисленные функции, чаще всего используются методы эмуляции CORDIC с плавающей запятой.
В большинстве современных компьютерных архитектур существует некоторое разделение операций с плавающей запятой и целочисленных операций. Это разделение значительно зависит от архитектуры; у некоторых есть выделенные регистры с плавающей запятой, в то время как некоторые, например Intel x86 , используют это как независимые схемы синхронизации . [6]
Процедуры CORDIC были реализованы в сопроцессорах Intel x87 ( 8087 , [7] [8] [9] [10] [11] 80287, [11] [12] 80387 [11] [12]] » до 80486 [7] серии микропроцессоров, а также в Motorola 68881 [7] [8] и 68882 для некоторых видов команд с плавающей запятой, в основном как способ уменьшить количество вентилей (и сложность) подсистемы FPU.
Операции с плавающей запятой часто конвейерные . В более ранних суперскалярных архитектурах без общего выполнения вне очереди операции с плавающей запятой иногда конвейеризовались отдельно от целочисленных операций.
Модульная архитектура микроархитектуры Bulldozer использует специальный FPU под названием FlexFPU, который использует одновременную многопоточность . Каждое физическое целочисленное ядро, по два на модуль, является однопоточным, в отличие от Intel Hyperthreading , где два виртуальных одновременных потока совместно используют ресурсы одного физического ядра. [13] [14]
Некоторое оборудование с плавающей запятой поддерживает только самые простые операции: сложение, вычитание и умножение. Но даже самое сложное оборудование с плавающей запятой имеет конечное число операций, которое оно может поддерживать - например, никакие FPU напрямую не поддерживают арифметику произвольной точности .
Когда ЦП выполняет программу, которая вызывает операцию с плавающей запятой, которая напрямую не поддерживается оборудованием, ЦП использует серию более простых операций с плавающей запятой. В системах без какого-либо оборудования с плавающей запятой ЦП эмулирует его, используя серию более простых арифметических операций с фиксированной запятой, которые выполняются на блоке целочисленной арифметической логики .
Программное обеспечение, которое перечисляет необходимые серии операций для имитации операций с плавающей запятой, часто упаковывается в библиотеку с плавающей запятой .
В некоторых случаях FPU могут быть специализированными и разделенными на более простые операции с плавающей запятой (в основном, сложение и умножение) и более сложные операции, такие как деление. В некоторых случаях только простые операции могут быть реализованы в аппаратном обеспечении или микрокоде , тогда как более сложные операции реализованы в виде программного обеспечения.
В некоторых современных архитектурах функциональность FPU объединена с модулями SIMD для выполнения вычислений SIMD; Примером этого является расширение набора инструкций x87 с помощью набора инструкций SSE в архитектуре x86-64, используемой в новых процессорах Intel и AMD.
В 1980-х годах в IBM PC / совместимых микрокомпьютерах было обычным делом, когда FPU был полностью отделен от процессора и обычно продавался как дополнительное дополнение. Его можно было купить только в том случае, если это необходимо для ускорения или включения математических программ.
IBM PC, XT и большинство совместимых устройств на базе 8088 или 8086 имели разъем для дополнительного сопроцессора 8087. AT и 80286 систем на основе , как правило , сокеты для 80287 и 80386 / 80386SX -машина - для 80387 и 80387SX соответственно, хотя первые из них были сокетами для 80287, так как 80387 еще не существовали. Другие компании производили сопроцессоры для серии Intel x86. К ним относятся Cyrix и Weitek .
Сопроцессоры были доступны для семейства Motorola 68000 , 68881 и 68882 . Они были широко распространены в Motorola 68020 / 68030 -На рабочие станции , как ВС-3 серии. Они также обычно добавлялись в старшие модели Apple Macintosh и Commodore Amiga , но, в отличие от IBM PC-совместимых систем, разъемы для добавления сопроцессора не были так распространены в младших системах.
Существуют также дополнительные сопроцессорные блоки FPU для микроконтроллеров (MCU / μC) / одноплатных компьютеров (SBC), которые служат для обеспечения арифметических операций с плавающей запятой . Эти дополнительные FPU не зависят от хост-процессора, обладают собственными требованиями к программированию ( операции , наборы инструкций и т. Д.) И часто снабжены собственными интегрированными средами разработки (IDE).
Важной частью архитектуры микропроцессоров Intel является наличие устройства для обработки числовых данных в формате с плавающей точкой, называемого математическим сопроцессором . Архитектура компьютеров на базе микропроцессоров вначале опиралась исключительно на целочисленную арифметику. С ростом мощи стали появляться устройства для обработки чисел с плавающей точкой. В архитектуре семейства микропроцессоров Intel 8086 устройство для обработки чисел с плавающей точкой появилось в составе компьютера на базе микропроцессора i8086/88 и получило название математический сопроцессор или просто сопроцессор. Выбор такого названия был обусловлен тем, что,
- во-первых, это устройство было предназначено для расширения вычислительных возможностей основного процессора;
- во-вторых, оно было реализовано в виде отдельной микросхемы, то есть его присутствие было необязательным. Микросхема сопроцессора для микропроцессора i8086/88 имела название i8087.
С появлением новых моделей микропроцессоров Intel совершенствовались и сопроцессоры, хотя их программная модель осталась практически неизменной. Как отдельные (а, соответственно, необязательные в конкретной комплектации компьютера) устройства, сопроцессоры сохранялись вплоть до модели микропроцессора i386 и имели название i287 и i387 соответственно. Начиная с модели i486, сопроцессор исполняется в одном корпусе с основным микропроцессором и, таким образом, является неотъемлемой частью компьютера.
Основные возможности математического сопроцессора:
- полная поддержка стандартов IEEE-754 и 854 на арифметику с плавающей точкой. Эти стандарты описывают как форматы данных, с которыми должен работать сопроцессор, так и набор реализуемых им функций;
- поддержка численных алгоритмов для вычисления значений тригонометрических функций, логарифмов и т. п.;
- обработка десятичных чисел с точностью до 18 разрядов, что позволяет сопроцессору выполнять арифметические операции без округления над целыми десятичными числами со значениями до 10 18 ;
- обработка вещественных чисел из диапазона ±3.37х10 -4932 …1.18х10 +4932 .
Форма представления чисел с плавающей точкой описана здесь .
Общая форма представления вещественных чисел предполагает возможность размещения в разрядной сетке следующих типов.
Числа простой и двойной точности ( float ( DD ) и double ( DQ ) соответственно) могут быть представлены только в нормированной форме. При этом бит целой части числа является скрытым и подразумевает логическую 1. Остальные 23 (52) разряда хранят двоичную мантиссу числа.
Числа двойной расширенной точности ( long double ( DT )) могут быть представлены как в нормированной, так и в ненормированной форме, поскольку бит целой части числа не является скрытым и может принимать значения как 0, так и 1.
Основным типом данных, которыми оперирует математический сопроцессор, являются 10-байтные данные ( DT ).
Программная модель сопроцессора
Программная модель сопроцессора представляет собой совокупность регистров, каждый из которых имеет свое функциональное назначение.
В программной модели сопроцессора можно выделить три группы регистров:
- Восемь регистров r0…r7 , составляющих основу программной модели сопроцессора — стек сопроцессора. Размерность каждого регистра 80 битов. Такая организация характерна для устройств, специализирующихся на обработке вычислительных алгоритмов.
- Три служебных регистра:
— регистр состояния сопроцессора swr (Status Word Register — регистр слова состояния) — отражает информацию о текущем состоянии сопроцессора;
— управляющий регистр сопроцессора cwr (Control Word Register — регистр слова управления) — управляет режимами работы сопроцессора;
— регистр тегов twr (Tags Word Register — слово тегов) — используется для контроля за состоянием каждого из регистров стека. - Два регистра указателей — данных dpr (Data Point Register) и команд ipr (Instruction Point Register). Они предназначены для запоминания информации об адресе команды, вызвавшей исключительную ситуацию и адресе ее операнда. Эти указатели используются при обработке исключительных ситуаций (но не для всех команд).
Все указанные регистры являются программно доступными. Однако к одним из них доступ получить достаточно легко, для этого в системе команд сопроцессора существуют специальные команды. К другим регистрам получить доступ сложнее, так как специальных команд для этого нет, поэтому необходимо выполнить дополнительные действия.
Регистр состояния swr – отражает текущее состояние сопроцессора после выполнения последней команды. В регистре swr содержатся поля, позволяющие определить: какой регистр является текущей вершиной стека сопроцессора, какие исключения возникли после выполнения последней команды, каковы особенности выполнения последней команды (некий аналог регистра флагов основного процессора).
Структурно регистр swr состоит из:
-
6 флагов исключительных ситуаций PE, OE, UE, ZE, DE, IE.
Исключения — это разновидность прерываний, с помощью которых процессор информирует программу о некоторых особенностях ее реального исполнения. Сопроцессор также обладает способностью возбуждения подобных прерываний при возникновении определенных ситуаций (не обязательно ошибочных). Все возможные исключения сведены к 6и типам, каждому из которых соответствует 1 бит в регистре swr . Программисту не обязательно писать обработчик для реакции на ситуацию, приведшую к некоторому исключению. Сопроцессор умеет самостоятельно реагировать на многие из них. Это так называемая обработка исключений по умолчанию. Для того чтобы вызвать обработку определенного типа исключения по умолчанию, необходимо это исключение оставить не маскированным. Такое действие выполняется с помощью установки в 1 соответствующего бита в управляющем регистре сопроцессора cwr . Типы исключений, фиксируемые с помощью регистра swr:
- IE (Invalide operation Error) — недействительный код операция;
- DE (Denormalized operand Error) — ненормированный операнд;
- ZE (divide by Zero Error) — ошибка деления на нуль;
- ОЕ (Overflow Error) — ошибка переполнения. Возникает в случае выхода порядка числа за максимально допустимый диапазон;
- UE (Underflow Error) — ошибка антипереполнения. Возникает, когда результат слишком мал (близок к нулю);
- РЕ (Precision Error) — ошибка точности. Устанавливается, когда сопроцессору приходится округлять результат из-за того, что его точное представление невозможно. Так, сопроцессору никогда не удастся точно разделить 10 на 3.
Регистр управления работой сопроцессора cwr – определяет особенности обработки числовых данных. С помощью полей в регистре cwr можно регулировать точность выполнения численных вычислений, управлять округлением, маскировать исключения.
Он состоит из:
- шести масок исключений PM, UM, OM, ZM, DM, IM ;
- поля управления точностью PC (Precision Control);
- поля управления округлением RC (Rounding Control).
2-битовое поле управления точностью PC предназначено для выбора длины мантиссы. Возможные значения в этом поле означают:
- PC =00 — длина мантиссы 24 бита;
- PC =10 — длина мантиссы 53 бита;
- PC =11 — длина мантиссы 64 бита.
По умолчанию устанавливается значение поля PC =11.
Поле управления округлением RC позволяет управлять процессом округления чисел в процессе работы сопроцессора. Необходимость операции округления может появиться в ситуации, когда после выполнения очередной команды сопроцессора получается не представимый результат, например, периодическая дробь. Установив одно из значений в поле RC , можно выполнить округление в необходимую сторону.
Значения поля RC с соответствующим алгоритмом округления:
- 00 — значение округляется к ближайшему числу, которое можно представить в разрядной сетке регистра сопроцессора;
- 01 — значение округляется в меньшую сторону;
- 10 — значение округляется в большую сторону;
- 11 — производится отбрасывание дробной части числа. Используется для приведения значения к форме, которая может использоваться в операциях целочисленной арифметики.
Бит 12 в регистре cwr физически отсутствует и считывается равным 0.
Регистр тегов twr – представляет собой совокупность двухбитовых полей. Каждое поле соответствует определенному физическому регистру стека и характеризует его текущее состояние. Команды сопроцессора используют этот регистр, например, для того, чтобы определить возможность записи значений в эти регистры. Изменение состояния любого регистра стека отражается на содержимом соответствующего этому регистру 2-битового поля регистра тега. Возможны следующие значения в полях регистра тега:
- 00 — регистр стека сопроцессора занят допустимым ненулевым значением;
- 01 — регистр стека сопроцессора содержит нулевое значение;
- 10 — регистр стека сопроцессора содержит одно из специальных численных значений, за исключением нуля;
- 11 — регистр пуст и в него можно производить запись. Это значение в двухбитовом поле регистра тегов не означает, что все биты соответствующего регистра стека должны быть обязательно нулевыми.
Принцип работы сопроцессора
Регистровый стек сопроцессора организован по принципу кольца. Cреди восьми регистров, составляющих стек, нет такого, который является вершиной стека. Все регистры стека с функциональной точки зрения абсолютно одинаковы и равноправны. Вершина в кольцевом стеке сопроцессора является плавающей. Контроль текущей вершины осуществляется аппаратно с помощью 3-битового поля top регистра swr .
В поле top фиксируется номер регистра стека r0…r7 , являющегося в данный момент текущей вершиной стека.
Команды сопроцессора оперируют не физическими номерами регистров стека r0…r7 , а их логическими номерами st(0)…st(7) . C помощью логических номеров реализуется относительная адресация регистров стека сопроцессора. Например, если текущей вершиной до записи в стек является физический регистр стека r3 , то после записи в стек текущей вершиной становится физический регистр стека r2 . То есть, по мере записи в стек, указатель его вершины движется по направлению к младшим номерам физических регистров (уменьшается на единицу). Если текущей вершиной является r0 , то после записи очередного значения в стек сопроцессора его текущей вершиной станет физический регистр r7 . Что касается логических номеров регистров стека st(0)…st(7) , то они перемещаются вместе с изменением текущей вершины стека. Логическая вершина стека всегда имеет имя st(0) .
Поскольку при написании программы разработчик манипулирует не абсолютными, а относительными номерами регистров стека, у него могут возникнуть трудности при попытке интерпретации содержимого регистра тегов twr , с соответствующими физическими регистрами стека. В качестве связующего звена необходимо привлекать информацию из поля top регистра swr . Таким образом реализуется принцип кольца.
Такая организация стека обладает большой гибкостью, в частности при передаче параметров в процедуру. Для повышения гибкости разработки и использования процедур не желательно привязывать их по передаваемым параметрам к аппаратным ресурсам (физическим номерам регистров сопроцессора). Гораздо удобнее задавать порядок следования передаваемых параметров в виде логических номеров регистров. Такой способ передачи был бы однозначным и не требовал от разработчика знания лишних подробностей об аппаратных реализациях сопроцессора. Логическая нумерация регистров сопроцессора, поддерживаемая на уровне системы команд, идеально реализует эту идею. При этом не имеет значения, в какой физический регистр стека сопроцессора были помещены данные перед вызовом подпрограммы, определяющим является только порядок следования параметров в стеке. По этой причине подпрограмме важно знать только порядок размещения передаваемых параметров в стеке.
Принцип работы сопроцессора совместно с центральным процессором
Процессор и сопроцессор имеют свои раздельные системы команд и форматы обрабатываемых данных. Несмотря на то, что сопроцессор архитектурно представляет собой отдельное вычислительное устройство, он не может существовать отдельно от основного процессора. Процессор и сопроцессор, являясь двумя самостоятельными вычислительными устройствами, могут работать параллельно. Но это распараллеливание распространяется только на выполнение команд. Оба процессора подключены к общей системной шине и имеют доступ к одной и той же информации. Инициирует процесс выборки очередной команды всегда основной процессор. После выборки команда попадает одновременно в оба процессора. Любая команда сопроцессора имеет код операции, первые пять бит, которого имеют значение 11011. Когда код операции начинается этими битами, то основной процессор по дальнейшему содержимому кода операции выясняет, требует ли данная команда обращения к памяти. Если это так, то основной процессор формирует физический адрес операнда и обращается к памяти, после чего содержимое ячейки памяти выставляется на шину данных. Если обращение к памяти не требуется, то основной процессор заканчивает работу над данной командой (не делая попытки ее исполнения) и приступает к декодированию следующей команды из текущего входного командного потока. Выбранная команда попадает в сопроцессор одновременно с основным процессором. Сопроцессор, определив по первым пяти битам, что очередная команда принадлежит его системе команд, начинает ее исполнение. Если команда требует операнды из памяти, то сопроцессор обращается к шине данных за чтением содержимого ячейки памяти, которое к этому моменту предоставлено основным процессором.
В определенных случаях необходимо согласовывать работу обоих устройств. К примеру, если во входном потоке сразу за командой сопроцессора следует команда основного процессора, использующая результаты работы предыдущей команды, то сопроцессор не успеет выполнить свою команду за то время, пока основной процессор, пропустив сопроцессорную команду, выполнит свою. При этом что логика работы программы будет нарушена. Возможна и другая ситуация. Если входной поток команд содержит последовательность из нескольких команд сопроцессора, то процессор пропустит их очень быстро, но он должен обеспечить внешний интерфейс для сопроцессора. Эти и другие, более сложные ситуации, приводят к необходимости синхронизации между собой работы двух процессоров. В первых моделях микропроцессоров это делалось путем вставки перед или после каждой команды сопроцессора специальной команды wait или fwait . Работа данной команды заключалась в приостановке работы основного процессора до тех пор, пока сопроцессор не закончит работу над последней командой. В моделях микропроцессора (начиная с i486) подобная синхронизация выполняется автоматически. Но для некоторых команд из группы команд управления сопроцессором оставлена возможность выбора между командами с синхронизацией (ожиданием) и без нее.
Математический сопроцессор — сопроцессор для расширения командного множества центрального процессора и обеспечивающий его функциональностью модуля операций с плавающей запятой, для процессоров, не имеющих интегрированного модуля.
Модуль операций с плавающей запятой (или с плавающей точкой; англ. floating point unit (FPU) ) — часть процессора для выполнения широкого спектра математических операций над вещественными числами.
Простым «целочисленным» процессорам для работы с вещественными числами и математическими операциями требуются соответствующие процедуры поддержки и время для их выполнения. Модуль операций с плавающей запятой поддерживает работу с ними на уровне примитивов — загрузка, выгрузка вещественного числа (в/из специализированных регистров) или математическая операция над ними выполняется одной командой, за счет этого достигается значительное ускорение таких операций.
Краткий обзор
Существует несколько способов того, как строки из цифр могут представлять числа:
- Наиболее распространённый путь представления значения числа из строки с цифрами — в виде целого числа — запятая (radix point) по умолчанию находится в конце строки.
- В общем математическом представлении строка из цифр может быть сколь угодно длинной, а положение запятой обозначается путём явной записи символа запятой (или, на Западе, точки) в нужном месте.
- В системах с представлением чисел в формате с фиксированной запятой существует определённое условие относительно положения запятой. Например, в строке из 8 цифр условие может предписывать положение запятой в середине записи (между 4-й и 5-й цифрой). Таким образом, строка «00012345» обозначает число 1,2345 (нули слева всегда можно отбросить).
- В экспоненциальной записи используют стандартный (нормализованный) вид представления чисел. Число считается записанным в стандартном (нормализованном) виде, если оно записано в виде aqn , где a , называемое мантиссой, такое, что , n — целое, называется показатель степени и q — целое, основание системы счисления (на письме это обычно 10). То есть в мантиссе запятая помещается сразу после первой значащей (не равной нулю) цифры, считая слева направо, а дальнейшая запись даёт информацию о действительном значении числа. Например, период обращения (на орбите) спутника планеты ЮпитераИо, который равен 152853,5047 с, в стандартном виде можно записать как 1,528535047×10 5 с. Побочным эффектом ограничения на значения мантиссы является то, что в такой записи невозможно изобразить число 0.
- Запись в форме с плавающей запятой похожа на запись чисел в стандартном виде, но мантисса и экспонента записываются раздельно. Мантисса записывается в нормализованном формате — с фиксированной запятой, подразумеваемой после первой значащей цифры. Возвращаясь к примеру с Ио́, запись в форме с плавающей запятой будет 1528535047 с показателем 5. Это означает, что записанное число в 10 5 раз больше числа 1,528535047, то есть для получения подразумеваемого числа запятая сдвигается на 5 разрядов вправо. Однако, запись в форме с плавающей запятой используется в основном в электронном представлении чисел, при котором используется основание системы счисления 2, а не 10. Кроме того, в двоичной записи мантисса обычно денормализована, то есть запятая подразумевается до первой цифры, а не после, и целой части вообще не имеется в виду — так появляется возможность и значение 0 сохранить естественным образом. Таким образом, десятичная 9 в двоичном представлении с плавающей запятой будет записана как мантисса +1001000…0 и показатель +0…0100. Отсюда, например, беды с двоичным представлением чисел типа одной десятой (0,1), для которой двоичное представление мантиссы оказывается периодической двоичной дробью — по аналогии с 1/3, которую нельзя конечным количеством цифр записать в десятичной системе счисления.
Запись числа в форме с плавающей запятой позволяет производить вычисления над широким диапазоном величин, сочетая фиксированное количество разрядов и точность. Например, в десятичной системе предоставления чисел с плавающей запятой (3 разряда) операцию умножения, которую мы бы записали как
0,12 × 0,12 = 0,0144
в нормальной форме представляется в виде
(1,20×10 −1 ) × (1,20×10 −1 ) = (1,44×10 −2 ).
В формате с фиксированной запятой мы бы получили вынужденное округление
0,120 × 0,120 = 0,014.
Мы потеряли крайний правый разряд числа, так как данный формат не позволяет запятой «плавать» по записи числа.
Регистры
В FPU можно выделить три группы регистров:
- Стек процессора: регистры R0..R7. Размерность каждого регистра: 80 бит.
- Служебные регистры
- Регистр состояния процессора SWR (Status Word Register) — информация о текущем состоянии сопроцессора. Размерность: 16 бит.
- Управляющий регистр сопроцессора CWR (Control Word Register) — управление режимами работы сопроцессора. Размерность: 16 бит.
- Регистр слова тегов TWR (Tags Word Register) — контроль за регистрами R0..R7 (например, для определение возможности записи) Размерность: 16 бит.
- Указатель данных DPR (Data Point Register). Размерность: 48 бит.
- Указатель команд IPR (Instruction Point Register). Размерность: 48 бит.
Сопроцессоры
x87 — это специальный набор инструкций для работы с математическими вычислениями, являющийся подмножеством архитектуры процессоров x86. Такое название он получил, потому что первоначальные отдельные математические сопроцессорные чипы имели названия, заканчивающиеся на 87. Как и другие расширения базового набора инструкций процессора, эти инструкции не являются строго необходимыми для построения рабочей программы, но будучи аппаратно реализованными, общие математические задачи они позволяют выполнять гораздо быстрее. Например, в наборе инструкций x87 присутствуют команды для расчёта значений синуса или косинуса.
Полезное
Машинная эпсилон
В отличие от чисел с фиксированной запятой, сетка чисел, которые способна отобразить арифметика с плавающей запятой, неравномерна: она более густая для чисел с малыми порядками и более редкая — для чисел с большими порядками. Но относительная погрешность записи чисел одинакова и для малых чисел, и для больших. Поэтому можно ввести понятие машинной эпсилон.
Машинной эпсилон называется наименьшее положительное число ε такое, что (знаком обозначено машинное сложение). Грубо говоря, числа a и b, соотносящиеся так, что , машина не различает.
Блок с плавающей запятой ( FPU , в просторечии математический сопроцессор ) - это часть компьютерной системы, специально разработанная для выполнения операций с числами с плавающей запятой . [1] Типичными операциями являются сложение , вычитание , умножение , деление и извлечение квадратного корня . Некоторые FPU могут также выполнять различные трансцендентные функции, такие как экспоненциальные или тригонометрические вычисления, но точность может быть очень низкой, [2] [3] так что некоторые системы предпочитают вычислять эти функции программно.
В компьютерных архитектурах общего назначения один или несколько блоков FPU могут быть интегрированы как исполнительные блоки в центральный процессор ; однако многие встроенные процессоры не имеют аппаратной поддержки операций с плавающей запятой (хотя они все чаще имеют их в стандартной комплектации, по крайней мере, 32-разрядные).
Когда ЦП выполняет программу, которая вызывает операцию с плавающей запятой, есть три способа выполнить ее:
- Эмулятор модуля с плавающей запятой (библиотека с плавающей запятой).
- Надстройка FPU.
- Интегрированный FPU.
Содержание
См. также
Использование в вычислительных машинах
В вычислительных машинах показатель степени принято отделять от мантиссы буквой «E» (exponent). Например, число 1,528535047×10 −25 в большинстве языков программирования высокого уровня записывается как 1.528535047E-25.
Смотреть что такое "Математический сопроцессор" в других словарях:
математический сопроцессор — — [Е.С.Алексеев, А.А.Мячев. Англо русский толковый словарь по системотехнике ЭВМ. Москва 1993] Тематики информационные технологии в целом EN match coprocessor … Справочник технического переводчика
Сопроцессор — Сопроцессор специализированный процессор, расширяющий возможности центрального процессора компьютерной системы, но оформленный как отдельный функциональный модуль. Физически сопроцессор может быть отдельной микросхемой или может быть… … Википедия
Блок операций с плавающей точкой — Математический сопроцессор 80x287 в колодке на базовой плате персонального компьютера. Сопроцессор Motorola 68881 Математический сопроцессор сопроцессор для расширения командного множества центрального процессора и обеспечивающий его… … Википедия
Периферийный процессор — Сопроцессор специализированный процессор, расширяющий возможности центрального процессора компьютерной системы, но оформленный как отдельный функциональный модуль. Физически сопроцессор может быть отдельной микросхемой или может быть встроен в… … Википедия
Intel 80486 — > Центральный процессор Микропроцессор Intel 80486 Производство: с 10 апреля … Википедия
80486 — > Центральный процессор … Википедия
80386 — В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена. Вы можете отредактировать эту статью … Википедия
Am486 — AMD Am486DX 40 Am486 семейство микропроцессоров архитектуры x86 компании AMD, предст … Википедия
Микропроцессорный комплект серии К1810 — Микропроцессорный комплект cерии К1810 набор микросхем, аналогичных набору микросхем для процессора Intel 8086, дальнейшее развитие микропроцессорного комплекта К580. Использовался в отечественных IBM PC совместимых компьютерах, таких как… … Википедия
Процессор — У этого термина существуют и другие значения, см. Процессор (значения). Запрос «ЦП» перенаправляется сюда; см. также другие значения. Intel Celeron 1100 Socket 370 в корпусе FC PGA2, вид снизу … Википедия
Происхождение названия
Название «плавающая запятая» происходит от того, что запятая в позиционном представлении числа (десятичная запятая, или, для компьютеров, двоичная запятая — далее по тексту просто запятая) может быть помещена где угодно относительно цифр в строке. Это положение запятой указывается отдельно во внутреннем представлении. Таким образом, представление числа в форме с плавающей запятой может рассматриваться как компьютерная реализация экспоненциальной записи чисел.
Преимущество использования представления чисел в формате с плавающей запятой над представлением в формате с фиксированной запятой (и целыми числами) состоит в том, что можно использовать существенно больший диапазон значений при неизменной относительной точности. Например, в форме с фиксированной запятой число, занимающее 8 разрядов в целой части и 2 разряда после запятой, может быть представлено в виде 123456,78; 8765,43; 123,00 и так далее. В свою очередь, в формате с плавающей запятой (в тех же 8 разрядах) можно записать числа 1,2345678; 1234567,8; 0,000012345678; 12345678000000000 и так далее, но для этого необходимо двухразрядное дополнительное поле для записи показателей степени 10 от 0 до 1610, при этом общее число разрядов составит 8+2=10.
Скорость выполнения компьютером операций с числами, представленными в форме с плавающей запятой, измеряется в мегафлопcах (от англ. FLOPS — число операций с плавающей запятой в секунду ), гигафлопcах и так далее, и является одной из основных единиц измерения быстродействия вычислительных систем.
Структура числа
Число с плавающей запятой состоит из:
- Мантиссы (выражающей значение числа без учёта порядка)
- Знака мантиссы (указывающего на отрицательность или положительность числа)
- Порядка (выражающего степень основания числа, на которое умножается мантисса)
- Знака порядка
Сопроцессоры x86 от сторонних производителей
Широкое распространение в соответствующий период получили сопроцессоры для платформы x86, выпускавшиеся компанией Weitek — ею были выпущены 1167, 2167 в виде набора микросхем и микросхемы 3167, 4167, для процессоров 8086, 80286, 80386, 80486, соответственно. По сравнению с сопроцессорами от Intel они обеспечивали в 2-3 раза большую производительность, но обладали несовместимым программным интерфейсом, реализованным через технологию memory-mapping. Она сводилась к тому, что основной процессор должен был записывать информацию в те или иные области памяти, контролируемые Weitek-овским сопроцессором (собственно, оперативной памяти там, конечно не было). Конкретный адрес, куда производилась запись, интерпретировался в качестве той или иной команды. Несмотря на несовместимость, сопроцессоры от Weitek были широко поддержаны как разработчиками ПО, так и производителями материнских плат, предусматривавших на них гнёзда для установки такой микросхемы.
Ряд других компаний также выпускал различные несовместимые математические сопроцессоры, реализуя интерфейс к ним через порты ввода-вывода или прерывания BIOS, но они не получили такого широкого распространения.
Компании-производители клонов выпускали совместимые с 80287 80387 сопроцессоры, работавшие быстрее аналогичных интеловских. Среди этих компаний можно упомянуть Cyrix, AMD, Chips & Technologies (C&T). Иногда система команд этих сопроцессоров расширялась несколькими несовместимыми, например, аналог 80287 от C&T содержал команды для работы с вектором из четырёх значений с плавающей точкой. Серьёзной поддержки от производителей ПО эти расширенные команды не получили.
Процессоры EMC87 от фирмы Cyrix могли работать как в режиме программной совместимости с Intel 80387, так и в собственном несовместимом режиме программирования. Для них обеспечивалась аппаратная совместимость с разъёмом 80387-го сопроцессора.
В СССР выпускалась микросхема (КМ)1810ВМ87, которая являлась аналогом 8087
Диапазон чисел, представимых в формате с плавающей запятой
Диапазон чисел, которые можно записать данным способом, зависит от количества бит, отведённых для представления мантиссы и показателя. На обычной 32-битной вычислительной машине, использующей двойную точность (64 бита), мантисса составляет 1 бит знак + 52 бита, показатель — 1 бит знак + 10 бит. Таким образом получаем диапазон точности примерно от 4,94×10 −324 до 1.79×10 308 (от 2 −52 × 2 −1022 до ~1 × 2 1024 ). Пара значений показателя зарезервирована для обеспечения возможности представления специальных чисел. К ним относятся значения NaN (Not a Number, не число) и +/-INF (Infinity, бесконечность), получающихся в результате операций типа деления на ноль нуля, положительных и отрицательных чисел. Также сюда попадают денормализованные числа, у которых мантисса меньше единицы. В специализированных устройствах (например GPU) поддержка специальных чисел часто отсутствует. Существуют программные пакеты, в которых объём памяти выделенный под мантиссу и показатель задаётся программно, и ограничивается лишь объёмом доступной памяти ЭВМ.
Форматы данных
Внутри FPU числа хранятся в 80-битном формате с плавающей запятой, для записи же или чтения из памяти могут использоваться:
- Вещественные числа в трёх форматах: коротком (32 бита), длинном (64 бита) и расширенном (80 бит).
- Двоичные целые числа в трёх форматах: 16, 32 и 64 бита.
- Упакованные целые десятичные числа (BCD) числа — длина максимального числа составляет 18 упакованных десятичных цифр (72 бита).
FPU также поддерживает специальные численные значения:
- Денормализованные вещественные числа — числа, которые меньше минимального нормализованного числа. При формировании такого значения в некотором регистре стека в соответствующем этому регистру теге регистра TWR формируется специальное значение (10).
- Бесконечность (положительная и отрицательная), возникает при делении на нуль ненулевого значения, а также при переполнениях. При формировании такого значения в некотором регистре стека в соответствующем этому регистру теге регистра TWR формируется специальное значение (10). (англ.not-a-number (NaN) ). Различают два вида нечисел:
- SNaN (Signaling Non a Number) — сигнальные нечисла. Сопроцессор реагирует на появление этого числа в регистре стека возбуждением исключения недействительной операции. Сопроцессор не формирует сигнальных чисел. Программисты формируют такие числа преднамеренно, чтобы возбудить в нужной ситуации исключение.
- QNaN (Quiet Non a Number) — спокойные (тихие) нечисла. Сопроцессор может формировать спокойные нечисла в качестве реакции на определённые исключения, например число вещественной неопределённости.
Сопроцессоры x86 от сторонних производителей
Широкое распространение в соответствующий период получили сопроцессоры для платформы x86, выпускавшиеся компанией Weitek - ею были выпущены 1167, 2167 в виде набора микросхем и микросхемы 3167, 4167, для процессоров 8086, 80286, 80386, 80486, соответственно. По сравнению с сопроцессорами от Intel они обеспечивали в 2-3 раза большую производительность, но обладали несовместимым программным интерфейсом, реализованным через технологию memory-mapping. Она сводилась к тому, что основной процессор должен был записывать информацию в те или иные области памяти, контролируемые Weitek-овским сопроцессором (собственно, оперативной памяти там, конечно не было). Конкретный адрес, куда производилась запись, интерпретировался в качестве той или иной команды. Несмотря на несовместимость, сопроцессоры от Weitek были широко поддержаны как разработчиками ПО, так и производителями материнских плат, предусматривавших на них гнёзда для установки такой микросхемы.
Ряд других компаний также выпускал различные несовместимые математические сопроцессоры, реализуя интерфейс к ним через порты ввода-вывода или прерывания
Компании-производители клонов выпускали совместимые с 80287 80387 сопроцессоры, работавшие быстрее аналогичных интеловских. Среди этих компаний можно упомянуть AMD, Chips & Technologies (C&T). Иногда система команд этих сопроцессоров расширялась несколькими несовместимыми, например, аналог 80287 от C&T содержал команды для работы с вектором из четырёх значений с плавающей точкой. Серьёзной поддержки от производителей ПО эти расширенные команды не получили.
Просессоры EMC87 от фирмы
В СССР выпускалась микросхема (КМ)1810ВМ87, которая являлась аналогом 8087
«Плавающая запятая» и «плавающая точка»
Так как в некоторых, преимущественно англоязычных и англофицированных, странах (см. подробный список Decimal separator (англ.) ) при записи чисел целая часть отделяется от дробной точкой, то в терминологии этих стран фигурирует название «плавающая точка» (floating point (англ.) ). Так как в России целая часть числа от дробной традиционно отделяется запятой, то для обозначения того же понятия исторически используется термин «плавающая запятая», однако в настоящее время в русскоязычной литературе и технической документации можно встретить оба варианта.
Устройство FPU
Все процессоры Intel и AMD, начиная с 486DX, имеют встроенный математический сопроцессор, и в отдельном сопроцессоре не нуждаются (за исключением Intel486SX). Тем не менее, термин x87 всё ещё используется для выделения той части инструкций процессора, которая занимается вычислениями с использованием плавающей запятой; компиляторы могут использовать эти инструкции для производства кода, который работает быстрее, нежели тот, что использует вызовы к библиотекам для выполнения операций с плавающей запятой.
Инструкции x87 совместимы со стандартом IEEE-754. Однако, x87 выполняют операции не в строгом соответствии с форматами IEEE-754, из-за использования более широких регистров. Поэтому последовательность арифметических операций может выполняться несколько по-разному на наборе x87 и на процессоре, строго следующем формату IEEE-754.
x87 организует свои регистры не как массив, как большинство других архитектур, а как регистровый стек, работающий по принципу обратной польской записи. Это означает, что в один момент времени, только два верхних регистра доступны для проведения операций, а доступ к другим регистрам требует манипуляций со стеком. Хотя такая организация получается и удобной для программистов, она делает трудоёмким построение эффективного кода x87 для компиляторов.
Начиная с Pentium III, вычисления с помощью инструкций SSE осуществляются с одинарной точностью, а в более поздних версиях — с двойной точностью форматов IEEE-754. После появления SSE2, использование x87 в значительной степени умаляется в 64-разрядных архитектурах x86-64 и связанных с ней 64-битных реализациях операционных систем, таких как Microsoft Windows, Mac OS X, Solaris, FreeBSD и Linux, хотя он по-прежнему хорошо поддерживается для полной совместимости со старыми приложениями.
Модуль операций с плавающей запятой [2] [3] представляет собой стековый калькулятор, работающий по принципу обратной польской записи. Перед операцией аргументы помещаются в LIFO-стек, при выполнении операции необходимое количество аргументов снимается со стека. Результат операции помещается в стек, где может быть использован в дальнейших вычислениях или может быть снят со стека для записи в память. Также поддерживается и прямая адресация аргументов в стеке относительно вершины.
Содержание
Содержание
Сопроцессоры Intel семейства x86
Для процессоров семейства x86 с 8086/8088 по 386, модуль операций с плавающей запятой был выделен в отдельную микросхему, называемую математическим сопроцессором. Для установки сопроцессора на плате компьютера предусматривался отдельный разъём.
Сопроцессор не является полноценным процессором, так как не умеет делать многих необходимых для этого операций (например, не умеет работать с программой и вычислять адреса памяти), являясь всего лишь придатком центрального процессора.
Одна из схем взаимодействия центрального процессора и сопроцессора, применяемая, в частности, в x86 сопроцессорах, реализуется следующим образом:
- Сопроцессор подключен к шинам центрального процессора, а также имеет несколько специальных сигналов для синхронизации процессоров между собой.
- Часть командных кодов центрального процессора зарезервирована для сопроцессора, он следит за потоком команд, игнорируя другие команды. Центральный процессор, наоборот, игнорирует команды сопроцессора, занимаясь только вычислением адреса в памяти, если команда предполагает к ней обращение. Центральный процессор делает цикл фиктивного считывания, позволяя сопроцессору считать адрес с адресной шины. Если сопроцессору необходимо дополнительное обращение к памяти (для чтения или записи результатов), он выполняет его через захват шины.
- После получения команды и необходимых данных сопроцессор начинает её выполнение. Пока сопроцессор выполняет команду, центральный процессор выполняет программу дальше, параллельно с вычислениями сопроцессора. Если следующая команда также является командой сопроцессора, процессор останавливается и ожидает завершения выполнения сопроцессором предыдущей команды.
- Также существует специальная команда ожидания (FWAIT), принудительно останавливающая процессор до завершения вычислений (если для продолжения программы необходимы их результаты). В настоящее время команда используется лишь для обработки исключений при работе с плавающей точкой, работа процессора и сопроцессора синхронизируется прозрачно для программиста [1] .
Начиная с процессора Intel486DX модуль операций с плавающей запятой был интегрирован в центральный процессор и назван FPU. В линейке Intel486SX модуль FPU отключался (поначалу в эту линейку попадали процессоры с бракованным FPU). Для процессоров Intel486SX также выпускался «сопроцессор» Intel487SX, но, фактически, он являлся процессором Intel486DX и при его установке процессор Intel486SX отключался.
Несмотря на интеграцию, FPU в процессорах i486 представляет собой неизменный сопроцессор, выполненный на том же кристалле, более того, схема FPU i486 полностью идентична сопроцессору предыдущего поколения 387DX вплоть до тактовой частоты (в два раза меньшей, чем частота центрального процессора). Настоящая интеграция FPU c центральным процессором началась только в процессорах Pentium модели MMX.
Другие платформы
Аналогично, материнские платы ПК, построенных на процессорах Motorola, до разработки этой фирмой процессора MC68040 (в который сопроцессор был встроен) содержали математический сопроцессор. Как правило, в качестве FPU использовался сопроцессор 68881 16 МГц или 68882 25 МГц. Практически любой современный процессор имеет встроенный сопроцессор.
Компания Weitek также выпускала математические сопроцессоры для платформ 68000 и MIPS.
Устройство FPU
Модуль операций с плавающей запятой представляет собой стековый калькулятор, работающий по принципу обратной польской записи. Перед операцией аргументы помещаются в LIFO-стек, при выполнении операции необходимое количество аргументов снимается со стека. Результат операции помещается в стек, где может быть использован в дальнейших вычислениях или может быть снят со стека для записи в память. Также поддерживается и прямая адресация аргументов в стеке относительно вершины.
Внутри FPU числа хранятся в 80-битном формате с плавающей запятой, для записи же или чтения из памяти могут использоваться:
- один из трёх форматов с плавающей точкой (32, 64 и 80 бит),
- целочисленные форматы (16, 32 и 64 бита),
- 80-битный BCD-формат.
Поддерживаемые математические операции: арифметические операции, сравнение, деление по модулю, округление, смена знака, модуль, квадратный корень, синус, косинус, частичный тангенс, частичный арктангенс, загрузка константы (0, 1, число пи, log2(10), log2(e), lg(2), ln(2)) и некоторые другие специфические операции.
FPU умеет обрабатывать пограничные состояния с помощью специальных значений, представимых форматом с плавающей запятой:
- денормализованное число (число, близкое к переполнению; при дальнейшем возрастании модуля денормализованное число становится бесконечностью),
- бесконечность (положительная и отрицательная), возникает при делении на нуль ненулевого значения а также при переполнениях,
- англ. not-a-number (NaN) ). Нечисла могут определять такие случаи, как:
- неопределённость (IND), возникает при комплексном результате (например, при вычислении квадратного корня из отрицательного числа) и в некоторых других случаях,
- недействительное значение (qNaN, sNaN) - может использоваться компилятором (для предотвращения использования неинициализированных переменных) или отладчиком,
В зависимости от флагов FPU, специальные значения могут инициировать обработку исключения операционной системой.
Математический сопроцессор — сопроцессор для расширения командного множества центрального процессора и обеспечивающий его функциональностью модуля операций с плавающей запятой, для процессоров, не имеющих интегрированного модуля.
Модуль операций с плавающей запятой (или с плавающей точкой; англ. floating point unit (FPU) ) — часть процессора для выполнения широкого спектра математических операций над вещественными числами.
Простым «целочисленным» процессорам для работы с вещественными числами и математическими операциями требуются соответствующие процедуры поддержки и время для их выполнения. Модуль операций с плавающей запятой поддерживает работу с ними на уровне примитивов — загрузка, выгрузка вещественного числа (в/из специализированных регистров) или математическая операция над ними выполняется одной командой, за счёт этого достигается значительное ускорение таких операций.
Система команд сопроцессора
Система включает около 80 команд. Их классификация:
- Команды передачи данных
- Вещественные данные
- Целочисленные данные
- Десятичные данные
- Загрузка констант (0, 1, число Пи, log2(10), log2(e), lg(2), ln(2))
- Обмен
- Условная пересылка (Pentium II/III)
- Вещественные данные
- Целочисленные данные
- Анализ
- С нулём
- Условное сравнение (Pentium II/III)
- Вещественные данные: сложение, вычитание, умножение, деление
- Целочисленные данные: сложение, вычитание, умножение, деление
- Вспомогательные арифметические команды (квадратный корень, модуль, изменение знака, выделение порядка и мантиссы)
- Тригонометрия: синус, косинус, тангенс, арктангенс
- Вычисление логарифмов и степеней
- Инициализация сопроцессора
- Работа со средой
- Работа со стеком
- Переключение режимов
Примечания
Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена.
Вы можете отредактировать эту статью, добавив ссылки на авторитетные источники.
Эта отметка установлена 13 мая 2011.- Технологии процессоров
- Расширения архитектуры x86
- Арифметика с плавающей запятой
Wikimedia Foundation . 2010 .
Нормальная форма и нормализованная форма
Нормальной формой числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) находится на полуинтервале [0; 1) (). Число с плавающей запятой, находящееся не в нормальной форме, теряет точность по сравнению с нормальной формой. [источник не указан 903 дня] Такая форма записи имеет недостаток: некоторые числа записываются неоднозначно (например, 0,0001 можно записать в 4 формах — 0,0001×10 0 , 0,001×10 −1 , 0,01×10 −2 , 0,1×10 −3 ), поэтому распространена (особенно в информатике) также другая форма записи — нормализованная, в которой мантисса десятичного числа принимает значения от 1 (включительно) до 10 (не включительно), а мантисса двоичного числа принимает значения от 1 (включительно) до 2 (не включительно) (). В такой форме любое число (кроме 0) записывается единственным образом. Недостаток заключается в том, что в таком виде невозможно представить 0, поэтому представление чисел в информатике предусматривает специальный признак (бит) для числа 0.
Так как старший разряд (целая часть числа) мантиссы двоичного числа (кроме 0) в нормализованном виде равен «1», то при записи мантиссы числа в эвм старший разряд можно не записывать, что и используется в стандарте IEEE 754. В позиционных системах счисления с основанием большим, чем 2 (в троичной, четверичной и др.), этого свойства нет.Сопроцессоры Intel семейства x86
Для процессоров семейства x86 с 8086/8088 по 386, модуль операций с плавающей запятой был выделен в отдельную микросхему, называемую математическим сопроцессором. Для установки сопроцессора на плате компьютера предусматривался отдельный разъём.
Сопроцессор не является полноценным процессором, так как не умеет делать многих необходимых для этого операций (например, не умеет работать с программой и вычислять адреса памяти), являясь всего лишь придатком центрального процессора.
Одна из схем взаимодействия центрального процессора и сопроцессора, применяемая, в частности, в x86 сопроцессорах, реализуется следующим образом:
- Сопроцессор подключен к шинам центрального процессора, а также имеет несколько специальных сигналов для синхронизации процессоров между собой.
- Часть командных кодов центрального процессора зарезервирована для сопроцессора, он следит за потоком команд, игнорируя другие команды. Центральный процессор, наоборот, игнорирует команды сопроцессора, занимаясь только вычислением адреса в памяти, если команда предполагает к ней обращение. Центральный процессор делает цикл фиктивного считывания, позволяя сопроцессору считать адрес с адресной шины. Если сопроцессору необходимо дополнительное обращение к памяти (для чтения или записи результатов), он выполняет его через захват шины.
- После получения команды и необходимых данных сопроцессор начинает её выполнение. Пока сопроцессор выполняет команду, центральный процессор выполняет программу дальше, параллельно с вычислениями сопроцессора. Если следующая команда также является командой сопроцессора, процессор останавливается и ожидает завершения выполнения сопроцессором предыдущей команды.
- Также существует специальная команда ожидания (FWAIT), принудительно останавливающая процессор до завершения вычислений (если для продолжения программы необходимы их результаты).
Начиная с процессора 486SX модуль FPU отключался (в эту линейку попадали процессоры с бракованным FPU). Для процессоров 486SX также выпускался «сопроцессор» 487SX, но, фактически, он являлся процессором 486DX и при его установке процессор 486SX отключался.
Несмотря на интеграцию, FPU в процессорах i486 представляет собой неизменный сопроцессор, выполненный на том же кристалле, более того, схема FPU i486 полностью идентична сопроцессору предыдущего поколения 387DX вплоть до тактовой частоты (в два раза меньшей, чем частота центрального процессора). Настоящая интеграция FPU c центральным процессором началась только в процессорах Pentium модели MMX.
Сопроцессоры
Другие платформы
Аналогично, материнские платы ПК, построенных на процессорах
Компания Weitek также выпускала математические сопроцессоры для платформ 68000 и
Читайте также: