Есть ли ошибка в numeric_limits или я просто запутался?
Я столкнулся с каким-то странным поведением, по крайней мере, в моем собственном уме, при отладке некоторого кода, связанного с определением, будет ли операция добавления потерять значение в два раза. Вот пример программы, демонстрирующей то, что я нашел.
#include <iostream>
#include <limits>
using std::cout;
using std::endl;
using std::numeric_limits;
int main()
{
double lowest = numeric_limits<double>::lowest();
bool truth = (lowest + 10000) == lowest;
cout << truth << endl;
}
Когда я выполняю этот код, я получаю истину в результате. Это ошибка или я просто лишен сна?
1 ответ
Самый маленький дубль это:
-1.7976931348623157e+308
Добавление 10 000 или 1e4 к этому будет иметь заметный эффект только в том случае, если удвоение имеет точность более 300 цифр, чего у них определенно нет. Двойники могут содержать только 15-17 значащих цифр.
Разница в величине между этими двумя числами настолько велика, что добавление 10000 не дает нового числа. На самом деле, минимальное двойное число - это такое огромное число (так сказать), что вы можете добавить к нему гугол - это 1, за которым следуют сто нулей, - и это не изменится.