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

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

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

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

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

3

Решение

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

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

4

Другие решения

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

0

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

например

double epsilon = 0.00001;
if (abs(value) < epsilon) // treat value as 0 in your code
-2
По вопросам рекламы [email protected]