Как хранится плавающая запятая? Когда это имеет значение?

В соответствии с этим вопросом , кажется, что некоторые числа не могут быть представлены плавающей точкой вообще и вместо этого приближены.

Как хранятся числа с плавающей запятой?

Существует ли общий стандарт для разных размеров?

Какого рода недостатки мне нужно следить, если я использую с плавающей запятой?

Являются ли они совместимыми с несколькими языками (например, какие преобразования мне нужно иметь для отправки числа с плавающей точкой из программы python в программу C через TCP / IP)?

-Адам

10 Solutions collect form web for “Как хранится плавающая запятая? Когда это имеет значение?”

Как уже упоминалось, статья Википедии о IEEE 754 неплохо показывает, как числа с плавающей запятой хранятся в большинстве систем.

Теперь, вот некоторые распространенные ошибки:

  • Самым большим является то, что вы почти никогда не хотите сравнивать два числа с плавающей запятой для равенства (или неравенства). Вместо этого вы захотите использовать больше или меньше сравнений.
  • Чем больше операций вы выполняете с числом с плавающей запятой, тем более значительными могут быть ошибки округления.
  • Прецизионность ограничена размером фракции, поэтому вы не сможете правильно добавить числа, разделенные на несколько порядков. (Например, вы не сможете добавить 1E-30 в 1E30.)

Подробное объяснение вопросов, связанных с числами с плавающей запятой, приведено в статье « Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой» .

Стандартом является IEEE 754 .

Конечно, есть другие способы хранения чисел, когда IEE754 недостаточно хорош. Библиотеки, такие как Java BigDecimal , доступны для большинства платформ и хорошо соответствуют типу номера SQL. Символы могут использоваться для иррациональных чисел, и отношения, которые не могут быть точно представлены в двоичной или десятичной плавающей запятой, могут храниться как отношение.

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

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

В C ++ правильное правило состоит в том, чтобы думать, что float дает вам 7 цифр точности, в то время как double дает вам 15. Кроме того, если вам интересно узнать, как проверить равенство, вы можете посмотреть этот вопрос.

В соответствии с этим вопросом, кажется, что некоторые числа не могут быть представлены плавающей точкой вообще и вместо этого приближены.

Верный.

Как хранятся числа с плавающей запятой? Существует ли общий стандарт для разных размеров?

Как уже упоминались другие плакаты, почти исключительно IEEE754 и его преемник IEEE754R. Googling дает вам тысячи объяснений вместе с битовыми шаблонами и их объяснением. Если у вас все еще есть проблемы, чтобы получить его, есть еще два распространенных формата FP: IBM и DEC-VAX. Для некоторых эзотерических машин и компиляторов (BlitzBasic, TurboPascal) есть некоторые нечетные форматы.

Какого рода недостатки мне нужно следить, если я использую с плавающей запятой? Являются ли они совместимыми с несколькими языками (например, какие преобразования мне нужно иметь для отправки числа с плавающей точкой из программы python в программу C через TCP / IP)?

Практически нет, они совместимы на разных языках.

Очень редко встречаются причуды:

  • IEEE754 определяет sNaNs (сигнализация NaN) и qNaNs (тихие NaN). Первые из них вызывают ловушку, которая заставляет процессор вызывать процедуру обработчика при загрузке. Последние не делают этого. Поскольку разработчики языка ненавидели возможность того, что sNaNs прерывают свой рабочий процесс и поддерживают их, обеспечивают поддержку подпрограмм обработчиков, sNaN почти всегда молча преобразуются в qNaN. Поэтому не полагайтесь на преобразование 1: 1. Но опять же: это очень редко и происходит только при наличии NaNs.

  • У вас могут быть проблемы с контентом (байты в неправильном порядке), если файлы между разными компьютерами являются общими. Это легко обнаружить, потому что вы получаете NaN для чисел.

Да, стандарт IEEE для двоичной арифметики с плавающей точкой (IEEE 754)

Число разбивается на три части: знак, показатель экспоненты и дробь, при сохранении в двоичном формате.

Эта статья, озаглавленная «Номера плавающих точек стандарта IEEE Standard 754», может быть полезна. Честно говоря, я не совсем уверен, что понимаю ваш вопрос, поэтому я не уверен, что это будет полезно, но я надеюсь, что так оно и будет.

Если вы действительно обеспокоены ошибками округления с плавающей точкой, большинство языков предлагают типы данных, которые не имеют ошибок с плавающей запятой. SQL Server имеет типы данных Decimal и Money. .Net имеет тип данных Decimal. Они не являются бесконечной точностью, как BigDecimal в Java, но они точны вплоть до числа десятичных точек, для которых они определены. Таким образом, вам не нужно беспокоиться о значении доллара, которое вы вводите в качестве $ 4.58, которое будет сохранено как значение с плавающей запятой 4.579999999999997

Я помню, что 32-битная плавающая точка хранится с использованием 24 бит для действительного числа, а оставшиеся 8 бит используются как мощность 10, определяя, где находится десятичная точка.

Я немного ржавый по этому поводу …

  • Сделать поплавок показывать только два десятичных знака
  • Float vs Decimal в ActiveRecord
  • сравнение значений float / double с использованием оператора ==
  • Каков всеобъемлющий диапазон float и double в Java?
  • Почему это вычитание не равно нулю?
  • Почему GCC не оптимизирует a * a * a * a * a * a to (a * a * a) * (a * a * a)?
  • Есть ли функция для округления поплавка на C или мне нужно написать собственное?
  • Преобразовать float в строку с заданной точностью и количеством десятичных цифр?
  • Функции сравнения с плавающей запятой для C #
  • извлечение мантиссы и экспонента из двойного в c #
  • Почему Double.MIN_VALUE не является отрицательным?
  • Interesting Posts

    Как подключить два сервера node.js с websockets?

    Есть ли альтернатива правилам Outlook?

    Как реализуется class StringBuilder? Внутренне ли он создает новые строковые объекты каждый раз, когда мы добавляем?

    Параллельная модификация Исключение: добавление в ArrayList

    Создание домашнего кластера – анализ аппаратных средств и затрат

    Права доступа к файлам Linux и запрос контроля доступа

    Как рассчитывается соединение в Firebase

    Как замаскировать квадратное изображение в изображение с круглыми углами в iPhone SDK?

    Почему установка npm говорит, что у меня есть неудовлетворенные зависимости?

    Сравните значения двух массивов – classического asp

    Как преобразовать изображение растрового изображения низкого качества в вектор?

    Простой пример Android RecyclerView

    Обнаружение изменения атрибута значения атрибута, который я сделал

    Xcode 4 – ошибка «Недействительность подлинного подписи не найдена» при настройке профилей при установке нового Macintosh

    SSD AES-256 аппаратное шифрование – как настроить?

    Давайте будем гением компьютера.