Рассмотрим, например, следующие числа с двойной точностью:
x = 1232.2454545e-89;
y = -1232.2454545e-89;
Могу ли я быть уверенным, что y
всегда точно равно -x
(или Matlab uminus(x)
)? Или я должен ожидать небольшие числовые различия порядка или eps
, как это часто бывает при численных вычислениях? Попробуйте, например, sqrt(3)^2-3
: результат не равен нулю. Может ли это случиться и с унарным минусом? Является ли он потерянным, как квадратный корень?
Другой способ поставить вопрос: есть ли отрицательный числовой литерал, всегда равный отрицанию его положительной копии?
Мой вопрос относится к Matlab, но, вероятно, имеет больше общего с IEEE 754, чем с Matlab.
Я провел несколько тестов в Matlab с несколькими случайно выбранными числами. Я обнаружил, что в этих случаях
- Они оказываются равными.
-
typecast(x, 'uint8')
иtypecast(-x, 'uint8')
отличаются только знаковым битом, как определено формат двойной точности IEEE 754.
Это говорит о том, что ответ может быть положительным. Если применение унарного минуса изменяет только бит знака, а не значение, то точность не теряется.
Но, конечно, я проверил только несколько случаев. Я бы хотел убедиться, что это происходит во всех случаях.