Вы можете воспользоваться тем фактом, что, хотя каждое десятичное число с плавающей запятой не имеет точного представления в представлении с плавающей запятой IEEE-754 (которое использует двоичный код), * 1001 * каждое число с плавающей запятой IEEE имеет точное представлениев качестве десятичного числа с плавающей запятой .
В спецификации языка C ++ в [lex.fcon]
(«плавающие литералы») обсуждаются литералы с плавающей точкой.После описания всех частей литерала с плавающей запятой он говорит:
Если масштабированное значение находится в диапазоне представимых значений для его типа, результатом является масштабированное значение, если оно представимо, иначебольшее или меньшее представимое значение, ближайшее к масштабированному значению, выбранное способом, определяемым реализацией.
(Эта работа одинакова как для N3242, позднего рабочего документа C ++ 11, так и для N4741 от 2018 годаМне не удалось найти это описание на CPPReference .)
Это означает, что числа, подобные 0.1
, могут быть либо немного меньше, либо чуть больше желаемого значения, другие, как 0.5
.или 0.000000000931322574615478515625
(2 -30 ) будет иметь это значение со всеми соответствующими компиляторами.
Вам нужно взять десятичное число, получить представление IEEE-754 для числа либонепосредственно перед или сразу после него, затем преобразуйте это представление в эквивалентное десятичное число.Как только вы это сделаете, все совместимые со стандартами компиляторы, которые поддерживают формат с плавающей точкой IEEE-754, должны дать вам точно такую же константу.