IEEE гарантии с плавающей точкой
Я хотел бы знать, для следующих случаев, если стандарт IEEE гарантирует каждый возможный случай (исключая NaN и бесконечности) с использованием любого процессора, придерживающегося стандарта:
- Коммутативность: x # y = y # x
- Ассоциативность: (x # y) # z = x # (y # z)
- x - x = 0 (всегда ли x - x == 0.0f возвращает true?)
- x * 0 = 0 (всегда ли x * 0.0f == 0.0f возвращает true?)
- x * 1 = x (всегда ли x * 1.0f == x возвращает true?)
- x / x = 1.0f (всегда ли x / x == 1.0f возвращает true? За исключением, конечно, x = 0)
(# означает все операции: + - * /)
1 ответ
коммутативности:
+
а также*
гарантированы, если ни один из аргументовNaN
,-
а также/
не коммутативны и делятся на0.0
дает тебе+Inf
,-Inf
, или жеNaN
согласно числителю. Здесь я не рассматриваю подписанные нули.Ассоциативность. Точно нет. Добавление двух небольших чисел, за которыми следует большое число, является контрпримером.
x - x
является0
еслиx
являетсяNaN
,+Inf
, или же-Inf
в этом случае этоNaN
,x * 0
является0
еслиx
являетсяNaN
,+Inf
, или же-Inf
в этом случае этоNaN
,x * 1
являетсяx
еслиx
являетсяNaN
в этом случае этоNaN
,x / x
является1
если х не0.0
,+Inf
,-Inf
, или жеNaN
в этом случае этоNaN
,
Обратите внимание на тонкую разницу (5).