Я заметил, что существует много дискуссий на тему ошибок вычислений с плавающей запятой, которые требуют от вас использования более сложного сравнения, чем ==
. Тем не менее, все эти статьи, кажется, предполагают, что значение каким-то образом манипулируется (или дважды вычисляется), хотя я не видел примера, охватывающего очень простое копирование констант.
Обратите внимание на следующее:
const double magical_value = -10;
class Test
{
double _val;
public:
Test()
: _val(magical_value)
{
}
bool is_special()
{
return _val == magical_value;
}
};
Насколько я понимаю, magic_value
должно быть установлено во время компиляции, чтобы все округления происходили в этот момент. После этого значение нужно просто скопировать в класс и сравнить с исходным. Гарантируется ли безопасность такого сравнения? Или копирование или сравнение может привести к ошибкам здесь?
Пожалуйста, не предлагайте альтернативные методы сравнения или использования магических значений, это другая тема. Мне просто интересно это предположение.
Изменить: хочу отметить, что я немного боюсь, что на некоторых архитектурах оптимизация может привести к копированию значения в регистры с плавающей запятой разного размера, что приведет к различиям в точных значениях. Есть ли риск чего-то подобного?