Страницы

Поиск по вопросам

вторник, 25 февраля 2020 г.

Безопасно ли сравнивать переменные с присвоенными значениями константы между собой?

#cpp


Есть код:

const double Pi = 3.14;
double a = Pi;
double b = Pi;


кода типа:

double x = 3.;
double b = (4.0 - x) * Pi;


в программе быть не может, т.е. всегда идет присваивание var = Pi.

Корректно ли в этом (и только в этом) случае сравнивать a == b?

Чуть добавлю. Присвение константы в программе может выглядеть примерно так:

double b = some_expression;
if (b < Pi + epsilon && Pi - epsilon < b) b = Pi;


И никак иначе.

П.С. Использвание числа, похожего на математическое "пи" - только для примера, к
реальности отношения не имеет.

Попробуем сформулировать вопрос более широко. Есть две строки кода, идущие подряд.

double x = some_value;
double y = x;
// not double y = some_expression_that_equal_to_x;


Типы x, y одинаковые, это важно. Гарантированно ли одинаковое двоичное представление
x и y?
    


Ответы

Ответ 1



Ответ на более "широкий" вопрос. Да, одинаковое двоичное представление гарантировано. Без вариантов. В противном случае (помимо просто абсурдности) были бы возможны всякие интересные штуки например, при: double a = 3.14; операция a = a; меняла бы двоичное представление a.

Ответ 2



Если компилятор случайно подставит константу в выражение как long double, а переменная будет double, то неожиданно окажется, что они всё-таки не равны. Так что лучше не надо, если только ты не стопроцентно уверен, что твоя константа точно представима в типе double.

Комментариев нет:

Отправить комментарий