Консультация № 67840
20.12.2006, 14:06
0.00 руб.
0 2 2
Функция atof – преобразование строки в число типа float.
Функция fcvt – преобразование числа типа float в строку.

Подскажите как написать их своими руками?

Обсуждение

Неизвестный
20.12.2006, 14:19
общий
это ответ
Здравствуйте, Иванов Михаил Викторович!
Коды цифровых символов идут подрят, то есть ‘5‘-‘0‘=5 а при разборе строки справа налево достаточно каждый полученную цифру достаточно умножать на 10 в степени от нуля и увеличивающейся с каждой итерацией.
Теперь что касается перевода числа в строку:
Вариант - обратное преобразование, предварительное получение остатка от деления числа на 10 в соответсвующей степени: и ‘4‘ = ‘0‘+4
А дробную и целую части можн онапример обрабатывать отдельно.
Эти методы конечно примитывны и просто первыми напрашиваются.
Реально функции преобразования дествуют вероятно по другим алгоритмам и даже другими средствами.
Неизвестный
20.12.2006, 16:01
общий
это ответ
Здравствуйте, Иванов Михаил Викторович!
Вообще-то писать их надо на асме, а не на C.
В приложении пример. Убогий. Лень возиться. Без проверок корректности строки, округления, поддержки экспоненциальной записи и пр. Но надеюсь, наведет на мысль.
Да, а зачем Вам это нужно, если в стандартных библиотеках любого языка высокого уровня они реализованы и лучше Вы все-равно не сделаете.

Приложение:
#include <windows.h>#include <math.h>double _myatof(const char* s){ double ret = 0; int l = strlen(s); int n = 0; bool frac = false; int fracdigits = 1; if (s[0] == ‘-‘) n ++; while (n < l) { if (s[n] == ‘.‘) frac = true; else if (frac) { ret += pow(10.0, -fracdigits++) * (s[n] - ‘0‘); } else { ret *= 10; ret += s[n] - ‘0‘; } n++; } if (s[0] == ‘-‘) ret *= -1; return ret;}char* _myfcvt(double d, int count){ int _int = log10((double)abs((int)d)) + 1; int n = _int; if (d < 0) n ++; if (d - (int)d) n ++; n += count; char* ret = new char[n+1]; int pos = 0; if (d < 0) ret[pos++] = ‘-‘; int nd = (int) fabs(d); for (int i = 0; i < _int; i ++) ret[pos++] = ‘0‘ + nd / (int) pow(10.0, _int-i-1) % 10; if (d - (int)d) { ret[pos++] = ‘.‘; nd = (fabs(d) - nd) * pow(10.0, count); for (int i = 0; i < count; i ++) ret[pos++] = ‘0‘ + nd / (int) pow(10.0, count-i-1) % 10; } ret[pos] = 0; return ret;}int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){ double d1 = _myatof("095.04507"); char* str = _myfcvt(-03045.03480234, 4); delete [] str;}
Форма ответа