В C или другом языке, который использует плавающие значения IEEE, у меня есть две переменные x
и y
, которые гарантированно будут конечными, не-NaN, в основном нормальные числа.
У меня есть некоторый код, который предполагает, по сути, что следующий код не имеет никакого эффекта:
float x = get_x ();
float y = get_y ();
float old_x = x;
x += y;
x -= y;
assert (old_x == x);
x -= y;
x += y;
assert (old_x == x);
Я знаю, что это будет верно для определенных классов значений, то есть тех, которые не имеют "много" значимых цифр в мантиссе, но я хотел бы прояснить крайние случаи.
Например, двоичное выражение 1.3
будет иметь значимые цифры на всем протяжении мантиссы, как и 1.7
, и я не должен предполагать, что 1.3+1.7==3
точно, но могу ли я предположить, что если я добавлю такие числа вместе, а затем вычесть их, или наоборот, я верну первое значение снова?
Каковы формальные граничные условия для этого?