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

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

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

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

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

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

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

10 ответов

Как упомянуто, статья 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
поделиться

In follow up to this question, it appears that some numbers cannot be represented by floating point at all, and instead are approximated.

Correct.

How are floating point numbers stored? Is there a common standard for the different sizes?

As the other posters already mentioned, almost exclusively IEEE754 and its successor IEEE754R. Googling it gives you thousand explanations together with bit patterns and their explanation. If you still have problems to get it, there are two still common FP formats: IBM and DEC-VAX. For some esoteric machines and compilers (BlitzBasic, TurboPascal) there are some odd formats.

What kind of gotchas do I need to watch out for if I use floating point? Are they cross-language compatible (ie, what conversions do I need to deal with to send a floating point number from a python program to a C program over TCP/IP)?

Practically none, they are cross-language compatible.

Very rare occuring quirks:

  • IEEE754 defines sNaNs (signalling NaNs) and qNaNs (quiet NaNs). The former ones cause a trap which forces the processor to call a handler routine if loaded. The latter ones don't do this. Because language designers hated the possibility that sNaNs interrupt their workflow and supporting them enforce support for handler routines, sNaNs are almost always silently converted into qNaNs. So don't rely on a 1:1 raw conversion. But again: This is very rare and occurs only if NaNs are present.

  • You can have problems with endianness (the bytes are in the wrong order) if files between different computers are shared. It is easily detectable because you are getting NaNs for numbers.

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

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