Литерал с плавающей точкой для согласованности двоичного шаблона IEEE-754 между компиляторами - PullRequest
1 голос
/ 06 марта 2019

Вот вопрос с ответами на вопрос "Кроссплатформенная согласованность с плавающей запятой" , но он говорит исключительно о согласованности во время выполнения (с плавающей запятой IEEE).

Меня интересует согласованность во время компиляции , в частности:

Если у меня есть конкретное число с плавающей точкой и я хочу поставить Литерал с плавающей точкой в ​​моем исходном коде и каждый компилятор ориентируясь на архитектуру IEEE-754, компилируем ее в тот же бит шаблон, который на самом деле является плавающим (или двойным): что мне нужно делать?

  • Определенное количество цифр?
  • Точное десятичное число для этого набора битов (а не любое десятичное число, которое отображается в этот двоичный шаблон)?
  • Или

(я знаю, что в течение многих лет велись споры о том, что вам нужно сделать, чтобы значения с плавающей запятой и обратно передавались из формата IEEE в десятичные представления и обратно, и я не знаю, является ли это проблемой с плавающей запятой или нет литералы и компиляторы (и стандарт C ++).)

1 Ответ

1 голос
/ 07 марта 2019

Вы можете воспользоваться тем фактом, что, хотя каждое десятичное число с плавающей запятой не имеет точного представления в представлении с плавающей запятой 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, должны дать вам точно такую ​​же константу.

...