Безопасно ли 'const' двойное копирование + сравнение?

Я заметил, что существует много дискуссий на тему ошибок вычислений с плавающей запятой, которые требуют от вас использования более сложного сравнения, чем ==. Тем не менее, все эти статьи, кажется, предполагают, что значение каким-то образом манипулируется (или дважды вычисляется), хотя я не видел примера, охватывающего очень простое копирование констант.

Обратите внимание на следующее:

const double magical_value = -10;

class Test
{
    double _val;

public:
    Test()
        : _val(magical_value)
    {
    }

    bool is_special()
    {
        return _val == magical_value;
    }
};

Насколько я понимаю, magic_valueдолжно быть установлено во время компиляции, чтобы все округления происходили в этот момент. После этого значение нужно просто скопировать в класс и сравнить с исходным. Гарантируется ли безопасность такого сравнения? Или копирование или сравнение может привести к ошибкам здесь?

Пожалуйста, не предлагайте альтернативные методы сравнения или использования магических значений, это другая тема. Мне просто интересно это предположение.

Изменить: хочу отметить, что я немного боюсь, что на некоторых архитектурах оптимизация может привести к копированию значения в регистры с плавающей запятой разного размера, что приведет к различиям в точных значениях. Есть ли риск чего-то подобного?

10
задан Michał Górny 13 June 2012 в 09:09
поделиться