Konwersja z double na char* bez użycia sstream, string,sprintf

0

Witam, chciałbym zapytać o wskazówkę co do konwersji typu double na tablicę charów bez użycia sstring i innych bibliotek, które znacznie ułatwiłyby sprawę. Póki co napisałem takie coś, liczy ile trzeba zaalokować, nie wiem tylko jak zapisać to do tablicy charów, o ile na liczby przed przecinkiem mam jeszcze jakiś pomysł, to po przecinku, to nie wiem jak się za to zabrać, byłbym wdzięczny za jakąś wskazówkę.
Aha, no i liczbę charów źle zostanie policzona jeśli będzie np. double a = 23232.000001, ale niestey też nie wiem jak ominąć ten problem :|

#include <iostream>
#include <cmath> //fmod

char* doubleToChar(double a){
        int mem = 0;//liczy ile zaalokować charów
        double tmp=a;
        while( fmod(tmp,10) != 0){
                tmp*=10;
                mem++;
        }
        
        tmp=a;
        while(tmp>=1){
                ++mem;
                tmp/=10;
        }
        std::cout<<mem<<std::endl;
        char *tab = new char[mem+1]; //+1 na znak \0
        tmp=a;
        ////////////////
        ////////////////
        return tab;
}


int main(void){
        double a=44222.551111;

        std::cout<<doubleToChar(a)<<std::endl;
        return 0;
}

dodanie znacznika <code class="cpp"> - fp

0

char *doubleToChar(double a) { int mem=1+log10(a); ...Natomiast po przecinku to trudna sprawa ...
Najprościej: while(fmod(a*=10)<0.001) ++mem;

0

Nie wiem po co od razu liczysz wielkość bufora, jeśli możesz działać na lokalnym buforze, np. 50-cio znakowym. Po konwersji będziesz wiedział, ile musisz przydzielić pamięci. Choć z drugiej strony Twoja funkcja stwarza ryzyko wycieku pamięci, przez to że zwraca "goły" wskaźnik. W przykładowym kodzie masz wyciek:

std::cout << doubleToChar(a) << std::endl; // kto zwolni pamięć zwróconą przez funkcję?

Użyj std::stringa.

Co do części ułamkowej, można tak:

double    i, f;
std::string s;

f = fabs( modf(a, &i) );

for(int n = 0; n < std::numeric_limits<double>::digits10; ++n)
{
    f *= 10;
    double x = floor(f);
    s.push_back('0' + x);
    f -= x;
}

std::cout << s << '\n';

1 użytkowników online, w tym zalogowanych: 0, gości: 1