У меня есть следующее выражение C (переменные - 32-битные числа с плавающей запятой)
float result = (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0)
Предполагая, что x0==x1
и y0==y1
(и под ==
я имею в виду идентичность двоичного представления), могу ли я полагаться на тот факт, что выражение обязательно будет оцениваться как ноль (например, все биты числа с плавающей запятой установлены в 0)? Другими словами, могу ли я предположить, что всегда выполняются следующие инварианты?
memcmp(&a, &b, sizeof(float) == 0 => memcmp(a-b, (uint32_t)0, sizeof(float)) == 0
0*a == 0.0
Можно с уверенностью предположить, что все значения являются конечными числами (никаких INFINITY или NaN).
Изменить: как указано в ответах, умножение на 0 может давать нули со знаком. Могу ли я все-таки рассчитывать на то, что результат выражения будет равен 0.0 по правилам FP-сравнения, т.е.:
(result == 0.0)
Редактировать 1: Заменены приведения типов вызовами memcmp, чтобы лучше проиллюстрировать вопрос.
P.S. Я ограничиваю свой код только совместимыми компиляторами C11, если это имеет значение. Я также готов полагаться на поддержку STDC_IEC_559, если это поможет в моем случае.
y2 - y0
иx2 - x0
будут конечными? - person Oliver Charlesworth   schedule 13.07.2016a
иb
? Если они неuint32_t
, ваш код вызывает неопределенное поведение (нарушение эффективного правила типа). Так что все разрешено стандартом. То же самое дляZERO
- person too honest for this site   schedule 13.07.2016