Zahl in einen c-string schreiben, OHNE CRT-Funktionen



  • Uji, hab Deine Frage übersehen:
    Nein, also ehrlich gesagt will ichs nur aus Interesse wissen, außerdem dürften doch selbstgecodete Fkt's möglichweise schneller sein :p

    Also Ideen ? 😉



  • STRING schrieb:

    ... außerdem dürften doch selbstgecodete Fkt's möglichweise schneller sein :p

    Nö ... nach meiner Erfahrung sind sie meistens langsamer und habe mehr Fehler. Vorausgesetzt es handelt sich um die selbe Funktionalität. Haben sie weniger, so können sie schneller sein - wir hatten doch neulich mal so'n Thread über C- und C++-IO. Die Fehler bleiben.

    Gruß Werner :xmas2:



  • Habt ihr trotzdem eine Lösung für mich ? *bitte*





  • Danke für den Link, aber irgendwie funktioniert dieser Code überhaupt nicht und ich versteh auch irgendwie nicht ganz, was da gemacht wird. Könntest Du mit vielleicht eine kleine Beispielfunktion schreiben ? -Vieln Dank schonmal!!



  • #include <stdio.h>
    
    #define uchar unsigned char
    #define uint unsigned int
    #define code
    #define bit char
    #define DIGITS 6
    
    void outint( int val )
    {
      uint code TEST[] = { 10, 100, 1000, 10000 };
      uchar d, i;
      bit zero;
      uint uval = val;
    
      if( val < 0 ){
        uval = -val;
        putchar( '-' );
      }
    
      zero = 1;
      i = 4;
      do{
        i--;
        for( d = '0'; uval >= TEST[i]; uval -= TEST[i] ){
          d++;
          zero = 0;
        }
        if( zero == 0 )
          putchar( d );
      }while( i );
    
      putchar( (uchar)uval + '0' );
    }
    
    void outfloat( float val )
    {
      char ep, dp, i, num;
    
      if( val < 0 ){
        val = -val;
        putchar( '-' );
      }
      ep = 0;
      if( val != 0 ){
        if( val < 1 ){
          val *= 1000;
          ep = -3;
        }
    
        if( val >= 1000 ){
          val *= 0.001;
          ep = 3;
        }
      }
    
      for( dp = 1; val >= 10; val *= 0.1 )		// normalize (x.xxx)
        dp ++;
    
      for( i = DIGITS;; ){				// n digits
        putchar( (num = val) + '0' );		// get digit
        if( --i == 0 )
          break;
        if( --dp == 0 )				// set decimal point
          putchar( '.' );
        val = (val - num) * 10;			// next digit
      }
      if( ep ){
        putchar( 'e' );
        outint( ep );
      }
    }
    
    void main()
    {
        outfloat (0.1345);
        putchar ('\n');
        outfloat (99.998);
        putchar ('\n');
    }
    

    ...musst nur noch statt 'putchar' aufzurufen in ein array schreiben 🙂 :xmas2:


  • Mod

    yuck - stdio.h
    yuck - #define
    yuck - void main

    schon mal was von Division gehört? Der Teil für floats ist auch nicht gerade sonderlich genau (für eine Ausgabefunktion ist das fatal!). Die Techniken, die hier benutzt werden um gewissen Beschränkungen der Zielplattform gerecht zu werden, sind für eine Demonstration eher nicht geeignet.



  • camper schrieb:

    schon mal was von Division gehört? Der Teil für floats ist auch nicht gerade sonderlich genau. Die Techniken, die hier benutzt werden um gewissen Beschränkungen der Zielplattform gerecht zu werden, sind für eine Demonstration eher nicht geeignet.

    hey, das ist nicht von mir. ich hab's nur kopiert und die demonstration zeigt wie man's benutzen kann. dass die funktionen noch stark verbesserungswürdig sind, hab' ich auch schon vermutet..
    :xmas2:



  • Hm ok, der Code läuft! Danke!

    Allerdings gibt es das mit diesem e ... aus, ich brauch aber NUR Kommazahlen, also komplett ohne 'e'^^, wie kann ich das realisieren ?

    und Danke nochmal!


  • Mod

    net schrieb:

    hey, das ist nicht von mir. ich hab's nur kopiert

    So ganz ohne Kommentar machst du es dir aber schon zu eigen. Jedenfalls bezog sich meine Kritik auf den Code an sich, wenn du dich angesprochen fühlst, muss das wohl schlechtes Gewissen sein 😉



  • STRING schrieb:

    Allerdings gibt es das mit diesem e ... aus, ich brauch aber NUR Kommazahlen, also komplett ohne 'e'^^, wie kann ich das realisieren ?

    guck dir mal die funktion an (wofür ist 'ep' z.b. da) und versuch die zu verstehen. vielleicht reichts auch, wenn du DIGITS vergrösserst. etwas mehr eigeninitiative bitte 😉

    camper schrieb:

    So ganz ohne Kommentar machst du es dir aber schon zu eigen. Jedenfalls bezog sich meine Kritik auf den Code an sich, wenn du dich angesprochen fühlst, muss das wohl schlechtes Gewissen sein 😉

    ich hab' doch den link gepostet, daran sieht man dass nicht von mir ist (ich würde niemals die {} so übel setzen). ach, mist, jetzt verfalle ich wieder in den rechtfertigungs-modus 😉


Anmelden zum Antworten