2016-04-24 8 views
0

Что определяет представление чисел с плавающей запятой в памяти? Компилятором или FPU. Если представление зависит от FPU, то как компилятор хранит константы, такие как 1.337f в двоичном файле? Возможно, при запуске приложения происходит распаковка значений с плавающей запятой? Я давно интересовался этим вопросом, потому что программирование сети.С плавающей точкой

+0

Ну, для сетевого программирования рассмотрим сериализацию (всегда). –

+3

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

+0

Очевидно, что компилятор должен знать, какой формат будет использовать FPU, что, конечно же, делает, потому что он нацелен на определенную архитектуру. – harold

ответ

0

Что определяет представление чисел с плавающей точкой в ​​памяти

Компилятор определяет, какое представление он использует. Но, если он нацелен на fpu, тогда он должен использовать представление, используемое fpu.

Как компилятор хранит константы, такие как 1.337f в двоичном файле?

Как правило, в том же двоичном представлении, что и в памяти.

2

Стандарты C и C++ не требуют каких-либо конкретных представлений с плавающей точкой, хотя последние стандарты включают определенную поддержку для IEEE (то есть объекты, которые доступны, если реализация использует IEEE с плавающей запятой). Для конкретных реализаций (aka toolchains) представление с плавающей запятой зависит от хост-системы и, в некоторой степени, от решений поставщиков компилятора.

Для более старых микропроцессоров (и других аппаратных средств обработки, таких как микроконтроллеры, цифровые сигнальные процессоры [DSP] и т. Д.), Реализация часто используется в аппаратных средствах - например, набор специализированных электронных схем, которые реализуют регистры, которые представляют значения с плавающей запятой , и схемы, которые выполняют операции над такими регистрами.

В современных аппаратных средствах обработки (микроконтроллерах, DSP, графических процессорах, блоках с плавающей запятой и т. Д.) Реализация выполняется в микрокоде - упрощенно, на уровне аппаратных инструкций, реализующих машинные коды и конечный автомат (база как процессор работает, насколько это касается программ и операционных систем). Таким образом, наборы инструкций более высокого уровня (X86 и т. Д.) Используются исполняемыми файлами и операционными системами, а микрокод является посредником между операционной системой и аппаратным обеспечением (которое часто реализует очень простой набор инструкций). Термин «современный» в этом описании относителен - первые процессоры на основе микрокодов относятся к 1970-м годам.

Исторически сложилось так, что аппаратное обеспечение обработки реализовало с плавающей точкой множество способов - некоторые патентованные и некоторые стандартизированные. Существует несколько процессоров, которые поддерживают несколько различных представлений. В некоторых случаях программные слои эмулируют с плавающей точкой поверх аппаратных средств, которые вообще не поддерживают плавающую точку. Большинство компиляторов будут использовать поставляемые с плавающей точкой с плавающей точкой, если они доступны (а некоторые компиляторы имеют опции для выбора различных представлений с плавающей запятой, отражающих их целевые платформы), но ряд компиляторов, ориентированных на аппаратное обеспечение без поддержки с плавающей запятой, буквально эмулируют представления и операции в программном обеспечении ,

Спецификация с плавающей запятой IEEE (первая версия, относящаяся к 1985 году, самая последняя версия IEEE 754-2008), принятая в качестве международного стандарта ISO/IEC/IEEE 60559: 2011 определяет множество вещей, включая арифметические форматы (как значения, бесконечности, NaN и т. д. представлены в переменных с плавающей запятой), форматы обмена (кодирование для обмена значениями с плавающей запятой между системами), операции (для арифметики и т. д.), правила округления во время операций и обработка исключений (дело с вещами как деление на ноль). Спецификация IEEE развивалась в течение некоторого времени и становится все более распространенной в современном аппаратном и программном обеспечении.

0

Кто определяет представление, является FPU, который придерживается стандарта, с которым поддерживает компилятор.

Текущий стандарт: IEEE 754. В нем описывается, как должны быть представлены вычисления и данные с плавающей запятой (см. this article).

Данные всегда представлены фиксированным количеством битов, таких как 32-разрядная, 64-разрядная, 128-битная, 80-разрядная (расширенная точность a.k.a x86). В памяти они все, кроме бит. Но тогда каждый набор бит представляет собой компонент данных с плавающей запятой, такой как: самый старший бит (в зависимости от endianness) является знаком, другой набор бит является показателем, а другой значимой частью.

Затем поддержка компилятора стандарта (IEEE 754) генерирует код, специфичный для этого представления.

Итак, ответ user2079303 прав: кто определяет представление вашего кода, является компилятором, который нацелен на стандарт, однако он не будет работать, если стандарт не отвечает.

EDIT: Peter Ответ довольно подробно и охватывает многие другие случаи.

Смежные вопросы