strtod и underflow - PullRequest
       36

strtod и underflow

1 голос
/ 02 ноября 2010

Я хотел бы обнаружить недостаточное значение при преобразовании строки в double в C ++ (Visual C ++ 2010) с использованием функции strtod. Код ниже не работает, как я ожидал, хотя я сделал это в соответствии с документацией strtod:

 char numStr[] = "123456.122111111123123123123132123123123123123124434345345";
 char* pEnd;
 double d = strtod(numStr, &pEnd);
 int errorNum = errno;
 if (errorNum == ERANGE) // this should be true
 {
  // underflow occurred
 }

Используя отладчик, я обнаружил, что errorNum всегда имеет значение 0, а ERANGE равно 34.

Чего мне не хватает?

Ответы [ 3 ]

5 голосов
/ 02 ноября 2010

Это значение не уменьшается.Это (намного) больше, чем самый маленький нормальный положительный дубль.Даже последнее место в одиночестве (5 * 10 ^ -51).Наименьший нормальный 64-битный IEEE double равен 2 ^ -1022.

1 голос
/ 02 ноября 2010

Я думаю, что вы путаете «потерю точности» с «недостаточным». Вы получите недолговечность при вводе типа 1.0e-1000. strtod напрямую не сообщает о потере точности, но вы можете попробовать изменить последнюю цифру и повторить или что-то в этом роде.

0 голосов
/ 02 ноября 2010

Нет недостатка в вашем коде.Недопустимый результат - это что-то вроде 0,000 (1000 нулей), 001 преобразуется в 0. То, о чем вы говорите, - неточность, и проверить это сложно.Даже преобразование обратно в строку с snprintf и сравнение строк не обязательно сработает, поскольку snprintf не требуется для получения точных результатов, достаточно только для восстановления значения с strtod.То, что вы пытаетесь сделать, является сложной проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...