Оба равенства гарантируются с плавающей точкой IEEE 754, потому что результаты как x-x
, так и x * -1
представляются точно в виде чисел с плавающей запятой с той же точностью, что и x
.В этом случае, независимо от режима округления, точные значения должны быть возвращены совместимой реализацией.
РЕДАКТИРОВАТЬ: По сравнению с примером .1 + .2
.
Вы не можете добавить .1
и .2
в IEEE 754, потому что вы не можете представить их для передачи +
.Сложение, вычитание, умножение, деление и квадратный корень возвращают уникальное значение с плавающей запятой, которое, в зависимости от режима округления, находится непосредственно ниже, непосредственно выше, ближе всего с правилом обработки связей, ..., результат операции надте же аргументы в R .Следовательно, когда результат (в R ) представляется представимым в виде числа с плавающей запятой, это число автоматически является результатом независимо от режима округления.
Тот факт, что ваш компилятор позволяетВы пишете 0.1
как сокращение для другого, представимого числа без предупреждения, ортогонального определению этих операций.Например, когда вы пишете - (0.1)
, -
является точным: он возвращает в точности противоположность своего аргумента.С другой стороны, его аргумент не 0.1
, а double
, который ваш компилятор использует вместо него.
Короче говоря, другая часть причины, почему операция x * (-1)
является точной, заключается в том, что-1
можно представить как double
.