Как мы знаем, числа с плавающей запятой IEEE могут хранить точные представления всех целых чисел и целых чисел, кратных обратным степеням двойки, таким как 1/2 или 3/4, при условии, что числа остаются в пределах диапазона чисел с плавающей запятой. тип точки.
Однако гарантируют ли синтаксические анализаторы с плавающей запятой точные результаты анализа десятичных представлений таких чисел?
Например, если я использую 0.75
как литерал double
в программе на C, будет ли компилятор гарантировать, что скомпилированный код содержит точное представление 3/4, или есть риск, что он выдаст сумму некоторого неточного представления 0,7? а какое неточное представление 0.05?
Или, аналогичным образом, если я использую 3e4
как литерал double
, может ли точное число 3 быть умножено на какое-то неточное представление 2^(4*ln(10)/ln(2)) или что-то подобное?
Существуют ли какие-либо стандарты, которым обычно должны следовать FP-парсеры в этом вопросе, или это, как правило, полностью оставлено на усмотрение реализации? Если последнее, кто-нибудь знает, как на самом деле работают практически важные реализации, такие как GCC или glibc?
Я в основном просто спрашиваю из любопытства, а не потому, что хочу полагаться на поведение; но иногда может быть весьма удобно знать, что сравнения равенства FP гарантированно работают, если известно, что значения поступают только из буквальных источников.
c
. (В этом случае я почти уверен, что теоретически нет, а на практике — да.) - person Nemo   schedule 15.01.2013