atof dauert und dauert ...



  • der Befehl atof braucht ewig viel Zeit.

    in meiner Schleife nimmt er 30 Sekunden in Anspruch:

    dt.wert = atof(buffi.Mid(wertbeginn+1, wertende));

    gibt es eine schnellere Alternative zum atof?? (Außer einen schnelleren Rechner zu kaufen...)



  • selbst schreiben 😉



  • im ersten Moment dachte ich, das ist ein Scherz mit dem Selberschreiben.

    Aber es dürfte machbar sein - wenn man nur wüßte, wie ... (haha)



  • double AtoF(const char *zahl){
        double d= 0;
        double p= 10;
        double k= 1;
        if(zahl){
            for(int i= 0; zahl[i]; i++){
                if( zahl[i] >= '0' && zahl[i] <= '9'){
                    if( p == 1 )
                        k*= 10;
                    d*= p;
                    d+= ((double)zahl[i] - '0')/k;
                }
                else{
                    switch(zahl[i]){
                    case '.':
                    case ',':   p= 1; break;
                    }
                }
            }
        }
        return d;
    }
    
    +/- hab ich dir gelassen ;-)
    und es kann auch am anfang mal ein leerzeichen kommen ;-)
    


  • ich bezweifel allerdings, dass toostens Code schneller als atof ist



  • ich auch, aber er brauchte eine idee 😉



  • Meine Version ist doch schneller ...
    ... hat aber auch nicht alles implementiert ( +/- leerzeichen exponentschreibweeise)

    Profile- Programmstatistik:

    Funkt.        Funkt.+Unterfkt.      Anzahl
            Zeit     %         Zeit       %          Aufrufe  Funktion
    ------------------------------------------------------------------
           9,994   0,8        9,994   0,8      811 TEST(char const *) (test.obj) //atof()
           0,178   0,0        1,368   0,3      811 TEST(char const *) (test.obj) //AtoF()
    

    Versuchsprogramm:

    #include <iostream>
    using namespace std;
    
    double AtoF(const char *zahl){
        double d= 0;
        double p= 10;
        double k= 1;
        if(zahl){
            for(int i= 0; zahl[i]; i++){
                if( zahl[i] >= '0' && zahl[i] <= '9'){
                    if( p == 1 )
                        k*= 10;
                    d*= p;
                    d+= ((double)zahl[i] - '0')/k;
                }
                else{
                    switch(zahl[i]){
                    case '.':
                    case ',':   p= 1; break;
                    }
                }
            }
        }
        return d;
    }
    
    double TEST(const char *zahl){
        return AtoF(zahl);
    }
    
    void main(){
        char zahl[1000];
        for(double d= 0; d < 1000; d+= 1.23456789){
            sprintf(zahl, "%f", d);
            cout<<TEST(zahl)<<endl;
        }
    }
    

    [ Dieser Beitrag wurde am 09.09.2002 um 09:03 Uhr von toosten editiert. ]



  • Da aber ersichtlich ist das beide Programmversionen beim Test nicht mehr als 1% der Gesamtzeit brauchen würde ich sagen das nicht atof so langsam ist sondern etwas anderes in Deinem Programm ;-).


Log in to reply