Составителям разрешено делать несколько допущений, которые могут привести к неопределенному поведению (например, если добавление не переполняется). Могут ли они сделать такое предположение относительно с плавающей запятой NaN?Может ли оптимизатор предположить, что плавающая точка не NaN?
Например:
double a = some_calc();
double b = a;
if(a == b)
do_something();
Может оптимизатор удалить условный оператор и предположим, что это всегда так? Или он связан с правилами платформы с плавающей запятой (IEEE) и вынужден выполнять проверку в случае, если значение NaN?
То есть, может ли оптимизатор компилятора основываться на предположении, что double не содержит NaN? Поскольку стандарт C++ не говорит много о том, как работает плавающая точка на платформе, я не понимаю, действительно ли это полностью определено.
Если реализация документа сама по себе является поддержкой NaN, то она должна поддерживать NaN. Оптимизатор является частью реализации. Это достаточно информации? ;-) –
То есть, может ли реализация определить NaN таким образом, чтобы разрешить вышеупомянутую оптимизацию. Стандарт имеет функцию 'isnan', поэтому не будет потери функциональности. –
Я не думаю, что для стандарта C++ требуется «NaN! = NaN», где «NaN» - это спокойный NaN. Если я прав, то реализация C++ может определять свои собственные не-цифры, такие как 'NaN == NaN', а затем оптимизация будет действительна. Реализация не будет поддерживать * IEEE * NaNs. Если я ошибаюсь, и для C++ требуется, что «NaN! = NaN», то оптимизатор не может обрабатывать «operator == (double, double)», как он обрабатывает 'operator == (int, int)' , –