Точное кодирование значений с плавающей запятой в большей степени зависит от особенностей отдельных процессоров.Например, при оценке предположительно константного выражения должен ли ЦП использовать более точные 80-битные регистры ЦП и только округлять до 64-битных в конце?Если один компилятор скажет да, а другой нет - шаблон получит два различных экземпляра.Но некоторые другие компиляторы могут иметь только 64-битные регистры, и, возможно, разные процессоры могут отличаться в зависимости от значения epsilon.Порядок, в котором какой-либо компилятор выбирает оценку выражения, или то, была ли библиотека скомпилирована с использованием библиотеки эмуляции с плавающей точкой и т. Д., Может привести к таким несоответствиям.Кроме того, числа с плавающей запятой имеют некоторые странные граничные случаи: положительный и отрицательный 0 и т. Д., Для которых должно быть определено поведение.
Эти проблемы могут потенциально укусить в средах, где объекты компилируются на разных машинах (с разнымиПроцессоры, версии компилятора и флаги и т. Д.), Но для надежной связи.Предприятия обычно делают это, и бинарно-распределенные библиотеки тоже сталкиваются с такими проблемами.Компиляторы C ++, как правило, пытаются использовать некоторый двоичный интерфейс приложений (ABI), который максимально согласован для версий и сред, но в настоящее время они не стандартизируют способ вычисления параметров с плавающей запятой, и не очевидно, как они могли бы, например, не ожидая, что все компиляторы будутиспользуйте ту же программную эмуляцию с плавающей точкой для получения значений.Это потребует усилий по координации, и существующие решения по эмуляции могут иметь проблемы с лицензированием.
Интересно, что Уолтер Брайт (из Digital Mars) думал, что это все дерьмо и позволяет использовать константы с плавающей точкой в D ... думаю, он получал некоторыереальный опыт последствий, которые были бы полезны для сообщества C ++, но я недавно не слышал.