Как преобразовать строку (содержащую double max) в double - PullRequest
2 голосов
/ 21 декабря 2009

У меня нет проблем с преобразованием "обычных" двойных значений, но я не могу преобразовать numeric_limits<double>::max() или DBL_MAX строковые представления?

std::string max = "1.79769313486232e+308";

std::istringstream stream(max);
double value;

// enters here, failbit is set
if (!(stream >> value))

Ответы [ 2 ]

10 голосов
/ 21 декабря 2009

Может ли быть что-то похожее на фактическое значение DBL_MAX, которое нельзя точно представить в экспоненциальной нотации с 16 десятичными знаками (скажем, десятичное значение очень немного больше, чем основанное на двух представлениях), но при инициализации double с DBL_MAX тем не менее установит правильное значение (из-за округления). std::istringstream может быть немного более разборчивым.

РЕДАКТИРОВАТЬ: На самом деле я обнаружил, что значение DBL_MAX в моем компиляторе составляет 1.7976931348623158e + 308, что прекрасно работает для потоковой передачи. Ваш номер округлен и немного больше, отсюда и ошибка.

РЕДАКТИРОВАТЬ 2: Точное значение DBL_MAX в десятичной форме задается (2 ^ (1023 - 52)) * (2 ^ 53 - 1), который не может быть представлен с 16 десятичными знаками.

1 голос
/ 21 декабря 2009

если вы используете

double v = 1.79769313486232e+308;
cout << v << endl;

это даст вам инф. это означает, что буквальное число фактически больше двойного.

...