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

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

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

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

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

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

36
задан RBT 17 July 2019 в 02:23
поделиться

9 ответов

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

Теперь, вот некоторые общие глюки:

  • самое большое - то, что Вы почти никогда не хотите сравнить два числа с плавающей точкой для равенства (или неравенство). Вы захотите использовать больше, чем/меньшее количество, чем сравнения вместо этого.
  • , Чем больше операций Вы делаете на числе с плавающей точкой, тем более значительные погрешности округления могут стать.
  • Точность ограничена размером части, таким образом, Вы не можете быть в состоянии правильно добавить числа, которые разделяются несколькими порядками величины. (Например, Вы не будете в состоянии добавить 1E-30 к 1E30.)
24
ответ дан Rob Pilkington 27 November 2019 в 05:59
поделиться

Полное объяснение проблем, окружающих числа с плавающей точкой, дано в статье , Что Каждый Программист Должен Знать Об Арифметике С плавающей точкой .

12
ответ дан ChrisN 27 November 2019 в 05:59
поделиться

Стандарт IEEE 754 .

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

5
ответ дан erickson 27 November 2019 в 05:59
поделиться

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

5
ответ дан Knox 27 November 2019 в 05:59
поделиться

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

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

3
ответ дан Community 27 November 2019 в 05:59
поделиться

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

, число разделяется на три части, знак, экспоненту и часть, когда сохранено в двоичном файле.

2
ответ дан stukelly 27 November 2019 в 05:59
поделиться

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

2
ответ дан Onorio Catenacci 27 November 2019 в 05:59
поделиться

Если Вы действительно волнуетесь по поводу погрешностей округления с плавающей точкой, большинство языков предлагает типы данных, которые не имеют ошибок с плавающей точкой. SQL Server имеет Типы данных decimal и Типы данных money..Net имеет Тип данных decimal. Они не бесконечная точность как BigDecimal в Java, но они точны вниз к количеству десятичных точек, для которых они определяются. Таким образом, Вы не должны волноваться о долларовой стоимости, Вы вводите как 4,58$, будучи сохраненным как значение с плавающей точкой 4,579999999999997

1
ответ дан Kibbee 27 November 2019 в 05:59
поделиться

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

я немного ржав на предмете tho...

0
ответ дан Rik 27 November 2019 в 05:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: