Для любого значения конечного плавающего значения гарантировано, что X - X == 0?

StackOverflow https://stackoverflow.com/questions/3599579

Вопрос

Плавающая точка Значения невыразится, поэтому мы должны редко использовать строгое числовое равенство в сравнениях. Например, в Java это отпечатки false (Как видно на IDeone.com):

System.out.println(.1 + .2 == .3);
// false

Обычно правильный способ сравнить результаты расчетов с плавающей точкой, чтобы увидеть, если абсолютная разница против некоторого ожидаемого значения меньше, чем некоторые переносимые эпсилон.

System.out.println(Math.abs(.1 + .2 - .3) < .00000000000001);
// true

Вопрос в том, стоит ли или нет немного Операции могут дать точный результат. Мы знаем, что для любого не конечного значения плавающего точка x (т.е. тоже NaN или бесконечность), x - x является ВСЕГДА NaN.

Но если x Конечно, это что-либо из этого гарантировано?

  1. x * -1 == -x
  2. x - x == 0

(В частности, я больше всего заинтересован в поведении Java, но также приветствуются дискуссии по другим языкам.)


Для чего это стоит, я думаю (и я ошибаюсь здесь) ответ ДА! Я думаю, что это сводится к тому или нет ни для кого или нет IEEE-754. ценность с плавающей точкой, его Противоположное число всегда вычисляется точно. Поскольку например, float а также double имеет один выделенный бит только для знака, Похоже, это так, поскольку он нуждается ли только подчеркивание подписанного бита, чтобы найти аддитивную обратную (то есть по значимости должен быть оставлен нетронутым).

Связанные вопросы

Это было полезно?

Решение

Несмотря на то что x - x может дать вам -0 а не правда 0, -0 сравнивает как равное 0, Таким образом, вы будете в безопасности с вашим предположением о том, что какое-либо конечное число само по себе будет сравнивать равно нулю.

Видеть Есть ли значение с плавающей точкой X, для которого XX == 0 является ложным? Больше подробностей.

Другие советы

Оба равенства гарантированы с плавающей точкой IEEE 754, потому что результаты обоих x-x а также x * -1 представлены точно так же, как номера с плавающей точкой той же точности, что и x. Отказ В этом случае, независимо от режима округления, точные значения должны быть возвращены совместимой реализацией.

Редактировать: сравнение с .1 + .2 пример.

Вы не можете добавить .1 а также .2 в IEEE 754, потому что вы не можете представлять их перейти к +. Отказ Дополнение, вычитание, умножение, разделение и квадратное корневое возвращают уникальное плавающее значение, которое, в зависимости от режима округления, непосредственно находится ниже, непосредственно выше, ближайший с правилом для обработки галстуков, ..., результат работы на те же аргументы в р. Отказ Следовательно, когда результат (в р) случается, чтобы быть представленным в качестве номера с плавающей запятой, этот номер автоматически является результатом независимо от режима округления.

Тот факт, что ваш компилятор позволяет писать 0.1 Как сокращение для другого, представимое число без предупреждения является ортогональным определением этих операций. Когда вы пишете - (0.1) Например, - Точно: он возвращает ровно противоположность его аргументу. С другой стороны, его аргумент не 0.1, но double что ваш компилятор использует на своем месте.

Короче говоря, другая часть причины, по которой операция x * (-1) точнее, что -1 может быть представлен как double.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top