Есть ли ошибка в 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, за которым следуют сто нулей, - и это не изменится.

Другие вопросы по тегам