Подтвердить что ты не робот

Унарный минус просто меняет знак?

Рассмотрим, например, следующие числа с двойной точностью:

x = 1232.2454545e-89;
y = -1232.2454545e-89;

Могу ли я быть уверенным, что y всегда точно равно -x (или Matlab uminus(x))? Или я должен ожидать небольшие числовые различия порядка или eps, как это часто бывает при численных вычислениях? Попробуйте, например, sqrt(3)^2-3: результат не равен нулю. Может ли это случиться и с унарным минусом? Является ли он потерянным, как квадратный корень?

Другой способ поставить вопрос: есть ли отрицательный числовой литерал, всегда равный отрицанию его положительной копии?

Мой вопрос относится к Matlab, но, вероятно, имеет больше общего с IEEE 754, чем с Matlab.

Я провел несколько тестов в Matlab с несколькими случайно выбранными числами. Я обнаружил, что в этих случаях

Это говорит о том, что ответ может быть положительным. Если применение унарного минуса изменяет только бит знака, а не значение, то точность не теряется.

Но, конечно, я проверил только несколько случаев. Я бы хотел убедиться, что это происходит во всех случаях.

4b9b3361

Ответ 1

Этот вопрос зависит от компьютерной архитектуры. Однако знак чисел с плавающей запятой на современных архитектурах (включая ядра x64 и ARM) представлен одним знаковым битом, и у них есть инструкции по переводу этого бита (например, FCHS). В этом случае мы можем сделать два вывода:

  • Смена знака может быть достигнута (и действительно соответствует современным компиляторам и архитектурам) с помощью одной бит flip/инструкции. Это означает, что процесс полностью обратим, и нет потери числовой точности.
  • Для MATLAB не имеет смысла делать ничего, кроме самой быстрой, самой точной вещи, которая должна просто перевернуть этот бит.

Тем не менее, единственный способ убедиться в том, что будет проверять код сборки для uminus в вашей установке MATLAB. Я не знаю, как это сделать.