Что определяет представление чисел с плавающей запятой в памяти? Компилятором или FPU. Если представление зависит от FPU, то как компилятор хранит константы, такие как 1.337f в двоичном файле? Возможно, при запуске приложения происходит распаковка значений с плавающей запятой? Я давно интересовался этим вопросом, потому что программирование сети.С плавающей точкой
ответ
Что определяет представление чисел с плавающей точкой в памяти
Компилятор определяет, какое представление он использует. Но, если он нацелен на fpu, тогда он должен использовать представление, используемое fpu.
Как компилятор хранит константы, такие как 1.337f в двоичном файле?
Как правило, в том же двоичном представлении, что и в памяти.
Стандарты C и C++ не требуют каких-либо конкретных представлений с плавающей точкой, хотя последние стандарты включают определенную поддержку для IEEE (то есть объекты, которые доступны, если реализация использует IEEE с плавающей запятой). Для конкретных реализаций (aka toolchains) представление с плавающей запятой зависит от хост-системы и, в некоторой степени, от решений поставщиков компилятора.
Для более старых микропроцессоров (и других аппаратных средств обработки, таких как микроконтроллеры, цифровые сигнальные процессоры [DSP] и т. Д.), Реализация часто используется в аппаратных средствах - например, набор специализированных электронных схем, которые реализуют регистры, которые представляют значения с плавающей запятой , и схемы, которые выполняют операции над такими регистрами.
В современных аппаратных средствах обработки (микроконтроллерах, DSP, графических процессорах, блоках с плавающей запятой и т. Д.) Реализация выполняется в микрокоде - упрощенно, на уровне аппаратных инструкций, реализующих машинные коды и конечный автомат (база как процессор работает, насколько это касается программ и операционных систем). Таким образом, наборы инструкций более высокого уровня (X86 и т. Д.) Используются исполняемыми файлами и операционными системами, а микрокод является посредником между операционной системой и аппаратным обеспечением (которое часто реализует очень простой набор инструкций). Термин «современный» в этом описании относителен - первые процессоры на основе микрокодов относятся к 1970-м годам.
Исторически сложилось так, что аппаратное обеспечение обработки реализовало с плавающей точкой множество способов - некоторые патентованные и некоторые стандартизированные. Существует несколько процессоров, которые поддерживают несколько различных представлений. В некоторых случаях программные слои эмулируют с плавающей точкой поверх аппаратных средств, которые вообще не поддерживают плавающую точку. Большинство компиляторов будут использовать поставляемые с плавающей точкой с плавающей точкой, если они доступны (а некоторые компиляторы имеют опции для выбора различных представлений с плавающей запятой, отражающих их целевые платформы), но ряд компиляторов, ориентированных на аппаратное обеспечение без поддержки с плавающей запятой, буквально эмулируют представления и операции в программном обеспечении ,
Спецификация с плавающей запятой IEEE (первая версия, относящаяся к 1985 году, самая последняя версия IEEE 754-2008), принятая в качестве международного стандарта ISO/IEC/IEEE 60559: 2011 определяет множество вещей, включая арифметические форматы (как значения, бесконечности, NaN и т. д. представлены в переменных с плавающей запятой), форматы обмена (кодирование для обмена значениями с плавающей запятой между системами), операции (для арифметики и т. д.), правила округления во время операций и обработка исключений (дело с вещами как деление на ноль). Спецификация IEEE развивалась в течение некоторого времени и становится все более распространенной в современном аппаратном и программном обеспечении.
Кто определяет представление, является FPU, который придерживается стандарта, с которым поддерживает компилятор.
Текущий стандарт: IEEE 754. В нем описывается, как должны быть представлены вычисления и данные с плавающей запятой (см. this article).
Данные всегда представлены фиксированным количеством битов, таких как 32-разрядная, 64-разрядная, 128-битная, 80-разрядная (расширенная точность a.k.a x86). В памяти они все, кроме бит. Но тогда каждый набор бит представляет собой компонент данных с плавающей запятой, такой как: самый старший бит (в зависимости от endianness) является знаком, другой набор бит является показателем, а другой значимой частью.
Затем поддержка компилятора стандарта (IEEE 754) генерирует код, специфичный для этого представления.
Итак, ответ user2079303 прав: кто определяет представление вашего кода, является компилятором, который нацелен на стандарт, однако он не будет работать, если стандарт не отвечает.
EDIT: Peter Ответ довольно подробно и охватывает многие другие случаи.
- 1. с плавающей точкой литералы
- 2. Расчет с плавающей точкой
- 3. с плавающей точкой точность
- 4. с плавающей точкой округления
- 5. RegExp с плавающей точкой
- 6. операция с плавающей точкой
- 7. Арифметика с плавающей точкой
- 8. Ошибка «с плавающей точкой»
- 9. Исключение с плавающей точкой?
- 10. операции с плавающей точкой
- 11. Эквивалентность с плавающей точкой?
- 12. Создание схемы MySQL с плавающей точкой и плавающей точкой
- 13. питон вычисления с плавающей точкой
- 14. числа с плавающей точкой Представления
- 15. Изучение чисел с плавающей точкой
- 16. с плавающей точкой линейной интерполяцией
- 17. MIPS ассоциативных с плавающей точкой
- 18. определение округления с плавающей точкой
- 19. Несогласованный вывод с плавающей точкой
- 20. Matlab: ASCII с плавающей точкой
- 21. Случайное число с плавающей точкой
- 22. C- с плавающей точкой точность
- 23. Rejigging уравнение с плавающей точкой
- 24. Разбиение массива с плавающей точкой
- 25. FLD инструкция с плавающей точкой
- 26. IEEE 754 с плавающей точкой
- 27. Полы с плавающей точкой modulo
- 28. setprecision и с плавающей точкой
- 29. Число, большее с плавающей точкой
- 30. Проблема с плавающей точкой представления
Ну, для сетевого программирования рассмотрим сериализацию (всегда). –
Внутри процессора есть маленький гном, который неустанно выполняет все необходимые вычисления, используя любой формат, наиболее удобный для него. Пока что код C++ идет, ему все равно, и это не имеет значения. Только этот маленький гном и его маленький друг, крошечный тролль, который живет внутри вашего компилятора C++, должны прийти к соглашению относительно того, как должны отображаться числа с плавающей запятой. –
Очевидно, что компилятор должен знать, какой формат будет использовать FPU, что, конечно же, делает, потому что он нацелен на определенную архитектуру. – harold