Может ли операция, определенная как поведение, определяемое реализацией, иметь несколько возможных вариантов выполнения?
[conv.fpint] p2 говорит
Если преобразуемое значение находится в диапазоне значений, которые могут быть представлены, но значение не может быть представлено точно, это определяется реализацией выбора следующего более низкого или более высокого представляемого значения.
[intro.abstract] p2 говорит
Некоторые аспекты и операции абстрактной машины описываются в этом документе как определяемые реализацией (например, ). Они составляют параметры абстрактной машины. Каждая реализация должна включать документацию, описывающую ее характеристики и поведение в этих отношениях. Такая документация должна определять экземпляр абстрактной машины, соответствующий этой реализации (именуемый ниже «соответствующим экземпляром»).
[intro.abstract] p5 говорит
Соответствующая реализация, выполняющая правильно сформированную программу, должна давать то же наблюдаемое поведение, что и одно из возможных исполнений соответствующего экземпляра абстрактной машины с той же программой и теми же входными данными. Однако, если любое такое выполнение содержит неопределенную операцию, этот документ не предъявляет требований к реализации, выполняющей эту программу с этим вводом (даже в отношении операций, предшествующих первой неопределенной операции).
Учтите, что существует реализация, которая не может представлять значение16777217
именно в объекте типа float, и выбор для такого значения может быть либо16777216
или16777218
. Для всех нечетных моментов оценки преобразования он выбирает более низкое представимое значение, а для всех четных моментов оценки преобразования он выбирает более высокое представимое значение. Является ли это соответствующей реализацией?
float a1 = 16777217; // 16777216
float a2 = 16777217; // 16777218
.
.
.
float a<2n-1> = 16777217; // 16777216
float a<2n> = 16777217; // 16777218
Обновлять:
Похожий случай:
sizeof(int); // 4
sizeof(int); // 8
.
.
.
sizeof(int); // 4
sizeof(int); // 8
Для всех нечетных моментов оценки результаты все4
, и для всех четных моментов вычисленияsizeof(int)
, результаты все8
.