Я решал уравнение с использованием двойной точности, и я получил -7.07649e-17
как решение вместо 0
,
Я согласен, что это достаточно близко, чтобы я мог сказать, что это равно, но Я читал, что машина epsilon для двойного типа C ++ 2^-52
что больше, чем ценность, которую я получаю.
Так почему же у меня более низкая стоимость, чем у машинного эпсилона?
Почему значение не округляется до нуля?
Это не имеет большого значения, но когда я делаю логический тест, кажется, что моя ценность не равна нулю …
В этой истории есть две разные константы. Одним из них является 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