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;}