kostenloser Webspace werbefrei: lima-city


Problem mit Float

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    r*s

    Ich habe eine Anwendung in C++ geschrieben, die eine Zahl z.B. 12.78
    in 1278 verwandeln soll. Mein Quelltext dazu sieht wie folgt aus:

    #include<iostream>
    using namespace std;

    int main ()
    {
    float f;
    int i;
    f = 83.96;
    i=static_cast<int>(f * 100);
    cout<<i;
    cin>>i;
    }

    Dabei erhalte ich 8395:confused:. Da ich absoluter C++ Anf&#228;nger bin weiss ich nicht weiter und bitte daher um Hilfe.


    Beitrag geändert: 13.10.2007 16:24:16 von rms
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. #include<iostream>
    using namespace std;

    int main ()
    {
    float f;
    int i;
    f = 83.96f;
    i = static_cast<int> (f * 100);
    i++;
    cout << i;
    cin.get();
    cin.get();
    return 0;
    }

    Ich meine der Z&#228;hlt die Null auch als Zahl. Wei&#223; aber nicht so genau. au&#223;erdem musst du Deinen Code echt verbessern das ist schrecklich ^^
    Geb den Variablen immer bessere Bedeutungen als f oder i, gew&#246;hn es dir jetzt schon ab nur i oder f zu schreiben, weil sp&#228;ter bringt Dich das sehr durcheinander!
  4. c*a

    Ich habe keine Ahnung, warum dieses Problem auftritt, aber dass er bei der Null mit dem Z&#228;hlen anf&#228;ngt ist falsch.

    Folgender Code f&#252;hrt ja zum falschen Ergebnis 83.95 (ich hab mal die Literale richtig geschrieben, also ein f bei den Floats angeh&#228;ngt):

    #include<iostream>
    using namespace std;
    
    int main ()
    {
    float f;
    int i;
    f = 83.96f;
    i = static_cast<int>(f*100.0f);
    cout<<i;
    cin>>i;
    }


    dieser Code f&#252;hrt dagegen zum richtigen Ergebnis 83.96
    #include<iostream>
    using namespace std;
    
    int main ()
    {
    float f;
    int i;
    f = 83.96f;
    f = f*100.0f;
    i = static_cast<int>(f);
    cout<<i;
    cin>>i;
    }


    Im Nachhinein einfach 1 dazuzuaddieren funktioniert so nicht, da kommt sonst f&#252;r Zahlen wie f = 83.94f ein falsches Ergebnis raus.
  5. Anstatt wild mit casts rumzuschie&#223;en, reicht hier auch schon ein einfaches

    i = (int) f;

    Auch wenn das eigentlich C ist, bevor jmd. meckert.

    Beitrag geändert: 15.10.2007 21:31:06 von bitwax
  6. c*a

    bitwax schrieb:
    Anstatt wild mit casts rumzuschie&#223;en,
    Und was du machst ist kein cast??

    reicht hier auch schon ein einfaches

    i = (int) f;
    Sch&#246;n, aber was hilft uns das????
    Es tritt immer noch der selbe Fehler auf.
  7. nat&#252;rlich ist das ein cast.
    war auch nur zum vorbeugen gedacht.

    Beitrag geändert: 15.10.2007 22:47:33 von bitwax
  8. zum runden von float's nach integer kann man immer 0.5 addieren,
    bevor von double nach integer konvertiert wird.

    #include<iostream>
    using namespace std;
    
    int main ()
    {
        float f;
        int i;
        cout<<"f:";
        cin>>f;
        i=(int)(f*100.0+0.5);
        cout<<"i:"<<i;
        return 0;
    }


    Beitrag geändert: 15.10.2007 23:02:28 von tiwag
  9. c*a

    @tiwag: Es geht hier nicht ums mathematische Runden sondern ums korrekte Abrunden. Au&#223;erdem gib bei deinem Programm mal 0.005 ein => :frown:

    Also dieser Fehler ist wirklich :pissed: gerade was die Zahlendarstellung im Computer angeht, kenne ich mich eigentlich ganz gut aus (w&#252;rde ich mal behaupten).

    Noch ein paar Anmerkungen:
    1. Z. B. f&#252;r f = 83.96001f ist das Ergebnis noch 8396.

    2. Der &#187;Fehler&#171; (Ergebnis 8395) tritt auf meiner Windows/P4-Maschine (mit MinGW kompiliert) auf, auch auf meiner PIII-Linuxbox (mit g++ kompiliert) auf ABER er tritt bei meiner Unix/PowerPC (g++) Maschine nicht auf, da ist das Ergebnis 8396.

    Also ein Hinweis, dass es was konkret mit dem Prozessor zu tun hat (wenn jemand mal den Code in Pascal o. &#228;. &#252;bersetzt, kompiliert und das Ergebnis mitteilt w&#228;re das sehr nett).

    Bei Java gibt mir so was wie
    public class Main{
      public static void main(String [] args){    
        float f;
        int i;
        f = 83.96f;
        i = (int) (f*100.0f);
        System.out.println(i);
      }
    }

    &#252;brigens 8396 aus. Auf die virtuelle Maschine ist halt Verlass ;-)

    Beitrag geändert: 15.10.2007 23:43:49 von cga

  10. @tiwag: ... gib bei deinem Programm mal 0.005 ein => :frown:


    supi :biggrin:
  11. Autor dieses Themas

    r*s

    Ich bedanke mich bei den Versuchen mir zu helfen bei mir tritt das Problem auch unter Linux auf


    EDIT thw: Doppelpost entfernt, Inhalt des zweiten Postings war:

    Mit der "g&#252;ltigen" Adresse meine ich, dass wenn man zb. google.at eingiebt kommt ja dann auch http://www.google.at/ und das soll der dann auch aktualisieren

    mfG


    Beitrag geändert: 29.10.2007 19:58:34 von thw
  12. Also 'ne schnelle und elegante L&#246;sung hab ich jetzt nicht parat, aber ich kann zumindest nachvollziehen woher der Rundungsfehler kommt. Du musst im Hinterkopf haben dass Flie&#223;kommawerte (float und double) im Gegensatz zu z.B. long nie genau abgespeichert werden, sondern immer nur n&#228;herungsweise. Eine Ganzzahl kann (im jeweiligen Wertebereich) genau dargestellt werden, eine reelle Zahl wird intern immer als x^y (hoch) abgespeichert, was nat&#252;rlich oft nicht genau die gew&#252;nschte Zahl ist. Diese Rundungsfehler resultieren dann ganz einfach aus den abgespeicherten N&#228;herungswerten. Das ist auch der Grund weshalb man sich bei Flie&#223;kommaberechnungen nie zu sehr auf's Ergebnis verlassen sollte und weshalb man float und double nicht auf Gleichheit pr&#252;fen kann.

    Wenn du bei dieser Tahl auf Biegen und Brechen den Dezimalpunkt loswerden willst, besteht noch die M&#246;glichkeit, das ganze als String zu betrachten und den Punkt einfach zu entfernen. Ist halt aufw&#228;ndig und langsam und nicht besonders elegant... aber daf&#252;r in jedem Fall genau ;)

    MfG,
    thw
  13. Die schnellste un eleganteste L&#246;sung w&#228;ren in dem Fall warhrscheinlich zehnerpotenzen. o.O

    13,37 * 10&#178; = 1337
    1337 * 10^-2=13,37

    Einfach mal googlen oder wikin.
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!