Re: функция разбора действительных чисел на чистом C++
От: korzhik Россия  
Дата: 07.01.06 15:29
Оценка:
Здравствуйте, Дядюшка Че, Вы писали:

ДЧ>Предлагаю вашему вниманию функцию преобразования строки в вещественное число, которой пользуюсь уже достаточно долго.


ДЧ>Достоинства:

ДЧ> насчёт пробелов не согласен. считаю что данная функция не должна учитывать никаких пробелов, ну максимум можно учитывать только пробелы идущие перед числом.

ДЧ>Недостатки:

ДЧ> насчёт извлечения из потока, это не недостаток, она не должна этим заниматься, так что всё нормально.

ДЧ>Итак, сама функция!.. Прошу извинить за язык комментариев

[]
Функцию просмотрел мельком, вот комментарии:
1. строчку
    while ((c = *string++),(c != 0))

можно заменить, на
    while (c = *string++)


2. некорректно работает при переполнении
то есть, например, если подать число у которого експонента больше чем DBL_MAX_10_EXP,
например "1.23e+400" то результатом будет +INF, но функция вернёт true
Хотя это спорный момент, возможно так и надо делать. То есть число соответствует грамматике (значит функция возвращает true),
но на данной платформе такое число не представимо (результат +INF)



ДЧ>Суть алгоритма проста. Число "собирается" из десятичных разрядов в переменной x, как обычное целое. Позиция плавающей точки (или запятой) запоминается отдельно.

ДЧ>Если число записано в экспоненциальной форме (например, 0.499e-2), то считывается еще и экспонента — обычное целое число со знаком. После этого, исходя из позиции запятой и экспоненты, элементарно определяется, на сколько десятичных разрядов необходимо сдвинуть запятую влево (умножением на 10) или вправо (делением на 10).

Меня очень интерисует один вопрос. Скорость работы замеряли? сравнивали со стандартной функцией (strtod)?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.