Intereting Posts
Что касается флага с плавающей запятой, используемого при компиляции приложения для цели руки Оператор C if с помощью && – Какая функция будет выполняться в первую очередь? Почему Timer1 не рассчитывает на PIC18? MS VS 2008 и C99 Указатели функции Cuda 1 = false и 0 = true? sed заменить // на / * * / comments EXCEPT, когда // комментарии появляются внутри / * * / Почему при умножении чисел с плавающей запятой ошибок нет? Каков лучший способ объявить фиктивные переменные для вложенных циклов? тестирование программного обеспечения для программы подсчета слов в streamе charatcers Использование _crtBreakAlloc для поиска утечек памяти – идентификатор «_crtBreakAlloc» не определен Функции более высокого порядка в C как синтаксический сахар с минимальными усилиями Трубы, dup2 и exec () Как разделить длинное значение (32 бита) на четыре переменные char (8 бит) с помощью C? Преобразование типов. Что мне делать с значением OID PostgreSQL в libpq в C?

Как вычисляются поплавки на машине без FPU

Язык C имеет float тип данных. На некоторых машинах имеется процессор с плавающей запятой, который выполняет все вычисления с плавающей запятой. Мой вопрос: могут ли быть некоторые машины без процессора с плавающей запятой? Как такие машины используют плавающие точки?

Многие небольшие controllerы не имеют блоков с плавающей запятой. В этом случае имеется библиотека программного обеспечения с плавающей запятой.

В середине 1980-х годов мы считали себя благословенными, если наша система имела 8087, FPU для 8086 и 8088. К сожалению, наше программное обеспечение должно было работать правильно, если 8087 присутствовал или нет. Это означало захват и эмуляцию инструкций 8087, если он отсутствовал.

Вплоть до 486SX и без встроенного блока FPU процессор не имел.

Что касается микроcontrollerов, то в большинстве из них нет блока FPU.

Стандарт c допускает плавающие точки.

Ответственность компилятора заключается в том, чтобы перевести его на конкретную аппаратную архитектуру.

Если набор аппаратных команд поддерживает плавающие точки [и большинство современных машин], то, скорее всего, компилятор будет использовать его.

В противном случае ему придется создать код родного языка, который сам по себе имитирует поведение плавающих точек. Как это делается? Вы можете больше узнать о плавающих точках на странице wikipeida и в этой более подробной статье о арифметике с плавающей запятой

Вы обнаружите, что почти все современные настольные компьютеры и серверы include FPU.

Мобильные устройства высокого classа начали включать FPU, но не все из них имеют их. И если мы говорим о мобильных устройствах, отличных от высокого уровня, вы не найдете много устройств с FPU.

Во многих приложениях можно выполнить арифметику по дробным числам, используя «арифметику с фиксированной точкой», которая не требует FPU.

В других случаях вы можете делать ту же математику, что и FPU, но это занимает больше времени, когда вам приходится строить ее самостоятельно из других арифметических примитивов, вместо того, чтобы сложный чип заботиться об этом для вас.

Мой любимый пример моделирования с плавающей запятой в процессорах с фиксированной точкой представлен в MMIXware Дональда Кнута , полное моделирование процессоров в очень портативном C.

Эмулирующая плавающая точка немного медленная, но теоретически довольно простая. Это похоже на то, как большинство людей учились в старшей школе или около того: у вас есть число с показателем. Чтобы добавить или вычесть, вам нужно отрегулировать числа, чтобы они имели одинаковые показатели, затем добавляли / вычитали мантиссы. Чтобы умножить или разделить, вы умножаете / делите мантиссы и добавляете / вычитаете показатели.

Когда вы закончите это, вы нормализуете результат. В старшей школе мы использовали десятичную величину и обычно требовали ровно одну цифру до десятичной точки, поэтому (например) 10001 будет записано как 1.0001 x 10 4 . На компьютере детали немного отличаются (например, мы имеем дело с двоичным, а не десятичным), но основная идея почти такая же.