Стоит ли сравнивать числа с плавающей запятой на равенство с * относительной * ошибкой?

До сих пор я видел много постов, посвященных равенству чисел с плавающей точкой. Стандартный ответ на вопрос типа «как мы должны решить, равны ли x и y?» является

abs(x - y) < epsilon

где эпсилонфиксированныймалая константа. Это связано с тем, что «операнды» x и y часто являются результатом некоторых вычислений, в которых возникает ошибка округления, поэтому стандартный оператор равенства == - это не то, что мы имеем в виду, и мы должны спросить, действительно ли x и yблизко, не равный.

Теперь я чувствую, что если x «почти равен» y, то x * 10 ^ 20 также должен быть «почти равен» y * 10 ^ 20 в том смысле, чтородственник ошибка должна быть такой же (но «относительно» чего?). Но с этими большими числами вышеприведенный тест потерпит неудачу, то есть это решение не «масштабируется».

Как бы вы справились с этой проблемой? Должны ли мы изменить масштаб чисел или изменить эпсилон? Как? (Или моя интуиция не так?)

Вотсвязанный вопрос, но мне не нравится его принятый ответ, потому что reinterpret_cast мне кажется немного сложным, я не понимаю, что происходит. Пожалуйста, попробуйте предоставить простой тест.

Ответы на вопрос(5)

Ваш ответ на вопрос