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

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

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

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

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

Являются ли они совместимыми с несколькими языками (например, какие преобразования мне нужно иметь для отправки числа с плавающей точкой из программы 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, определяя, где находится десятичная точка.

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

  • Преобразование String для плавания в Apple Swift
  • Почему бы не использовать Double или Float для представления валюты?
  • Почему я вижу двойную переменную, инициализированную некоторым значением, например 21.4, как 21.399999618530273?
  • Должен ли я использовать double или float?
  • Разница между десятичной, плавающей и двойной в .NET?
  • Деление с плавающей запятой против умножения с плавающей запятой
  • Сравнение с плавающей точкой
  • Типы с плавающей запятой с фиксированным размером
  • Почему Double.NaN == Double.NaN возвращает false?
  • Равновесие и допуски с плавающей точкой
  • Почему 24.0000 не равно 24.0000 в MATLAB?
  • Давайте будем гением компьютера.