Почему мой двойник может содержать значение ниже машинного эпсилона?

Я решал уравнение с использованием двойной точности, и я получил -7.07649e-17 как решение вместо 0,

Я согласен, что он достаточно близок, чтобы сказать, что он равен, но я читал, что машинный эпсилон для двойного типа C++2^-52 что больше, чем ценность, которую я получаю.

Так почему же у меня более низкая стоимость, чем у машинного эпсилона? Почему значение не округляется до нуля?

Это не имеет большого значения, но когда я делаю логический тест, кажется, что моя ценность не равна нулю...

3 ответа

Решение

В этой истории есть две разные константы. Одним из них является epsilon, минимальное значение, которое при добавлении к 1.0 дает значение, отличное от 1.0. Если вы добавите меньшее значение к 1,0, вы снова получите 1,0, потому что существуют физические ограничения для представления числа в компьютере. Но есть значения, которые меньше эпсилона и больше нуля. Наименьшее такое число для double вы получаете с std::numeric_limits<double>::min,

Для справки, вы получаете эпсилон с std::numeric_limits<double>::epsilon,

Вам не гарантируется, что округление будет происходить в любое конкретное время. Стандарт C++ позволяет реализации использовать дополнительную точность практически везде, где это требуется, и многие реальные реализации делают именно это.

Распространенным решением проблемы точности с плавающей запятой является определение значения эпсилона самостоятельно и сравнение с ним вместо нуля.

например

double epsilon = 0.00001;
if (abs(value) < epsilon) // treat value as 0 in your code
Другие вопросы по тегам