Преобразование IEEE int-> float коммутируется с + и *? - PullRequest
3 голосов
/ 26 января 2011

Предположим, что TOFLOAT представляет операцию преобразования / приведения значения, имеющего некоторый целочисленный тип INT, к значению, имеющему некоторый (совместимый с диапазоном [1]) тип FLOAT с плавающей запятой, согласно стандартам IEEE. Коммутирует ли эта операция сложение и умножение? Другими словами, если x и y - произвольные значения типа INT, гарантирует ли стандарт IEEE, что следующие равенства всегда будут иметь значение true?:

  TOFLOAT(x) + TOFLOAT(y) == TOFLOAT(x+y)
  TOFLOAT(x) * TOFLOAT(y) == TOFLOAT(x*y)

Спасибо! * * 1004

~ * кдж 1006 *

[1] под «диапазонно-совместимым» Я имею в виду, что каждое значение типа INT вписывается в диапазон значений, представляемых как тип FLOAT; эта квалификация, вероятно, не нужна для типов IEEE.

Ответы [ 2 ]

3 голосов
/ 27 января 2011

Нет, ни то, ни другое Для простого контрпримера для первого с 64-битным (знаковым или беззнаковым) целочисленным типом и обычным двоичным типом IEEE двойной точности, рассмотрим случай, когда x = 2**53 + 1 и y = 2. Затем в соответствии с правилами IEEE 754, предполагая, что обычный режим округления по умолчанию - от половины до четного, TOFLOAT(x) + TOFLOAT(y) будет 2**53 + 2, а TOFLOAT(x + y) будет 2**53 + 4. Контрпримеры для случая умножения должны быть одинаково легко найдены.


РЕДАКТИРОВАТЬ: Для умножения, контрпример дается как x = 2**53 + 1 и y = 3.

1 голос
/ 26 января 2011

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

Действительно, 32-разрядные целые числа точно представимы в числах с плавающей запятой IEEE 754 двойной точности, и арифметические операции гарантированно будут точными в пределах 1 ULP. Поскольку у вас есть (строго) более 32-битная точность мантиссы, это должно выполняться.

...