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