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

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

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

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

На какие ошибки мне нужно обращать внимание, если я использую число с плавающей запятой?

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

Ответ 1

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

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

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

Ответ 3

Стандарт IEEE 754.

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Правильно.

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

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

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

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

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

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

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

Ответ 7

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

Ответ 9

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

Ответ 10

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

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