kostenloser Webspace werbefrei: lima-city


Wie geht ihr mit der Ungenauigkeit von Double um?

lima-cityForumProgrammiersprachenProgrammieren mit .NET & Mono

  1. Autor dieses Themas

    yorecords

    Kostenloser Webspace von yorecords

    yorecords hat kostenlosen Webspace.

    Hallo!

    Ich habe gerade eine Klasse zum umrechnen von Zeit geschrieben und hab die Ungenauigkeit von Double vorerst außer Acht gelassen. Jetzt beim Testen zeigt sich natürlich, dass ich das nicht so lassen kann.. Wenn ich z.B. 1 Woche in Tage umrechne ist das Ergebnis 7,0000001916. So ja an sich nicht so schlimm, nur wenn man ein präzises Ergebnis braucht kann man das vergessen. In diesem Fall könnte man natürlich einfach runden, funktioniert aber halt auch nur in diesem Fall.
    Wie geht ihr mit dieser Ungenauigkeit um? Gibt es da zufällig irgend eine zuverlässige Lösung?

    Danke im Voraus!

    Edit:
    Die Frage hat sich erübrigt... Ich Idiot hab vergessen, dass es Decimal gibt... :lol:

    Beitrag zuletzt geändert: 22.9.2012 2:55:30 von yorecords
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. g****e

    Float ist noch ungenauer ;-) Double ist schon recht gut.

    Im Normalfall interessieren diese weiten hinterkommastellen nicht, von demher ists mir meist egal. Git halt seltend Fälle, wo die Genauigkeit auf mehr als 4 Stellen interessiert, denn besonders bei der Messwertverarbeitung heißt es: Je genauer das ergebnis sein soll, desto falscher ist es. Denn die Geräte sind einfach nicht so exakt.
    Mich störts nich, ist vollkommen ok. Ich kenne kein Anwendungsfall so konkret, der wirklich so eine Genauigkeit erfordert.

    Liebe Grüße
  4. Autor dieses Themas

    yorecords

    Kostenloser Webspace von yorecords

    yorecords hat kostenlosen Webspace.

    ggamee schrieb:
    Float ist noch ungenauer ;-) Double ist schon recht gut.

    Im Normalfall interessieren diese weiten hinterkommastellen nicht, von demher ists mir meist egal. Git halt seltend Fälle, wo die Genauigkeit auf mehr als 4 Stellen interessiert, denn besonders bei der Messwertverarbeitung heißt es: Je genauer das ergebnis sein soll, desto falscher ist es. Denn die Geräte sind einfach nicht so exakt.
    Mich störts nich, ist vollkommen ok. Ich kenne kein Anwendungsfall so konkret, der wirklich so eine Genauigkeit erfordert.

    Liebe Grüße


    Gut zu wissen. Danke.
    Mir ist sowieso gerade aufgefallen, dass sich in diesem Fall komischerweise mit Decimal auch nichts ändert...
  5. yorecords schrieb:
    Mir ist sowieso gerade aufgefallen, dass sich in diesem Fall komischerweise mit Decimal auch nichts ändert...

    wenn du decimal einen Float/Double übergibst hasst du schon beim deklarieren die ungenaugkeit drinnen(Die dann aber genau ist ;)).

    Also ich arbeite soweit es möglich ist mit ints, das ist eigentlich immer die bessere wahl und wenn das nicht geht einfach floats und dann runden. Decimal hat halt den nachteil das es vergleichsweise Langsam ist.
  6. Autor dieses Themas

    yorecords

    Kostenloser Webspace von yorecords

    yorecords hat kostenlosen Webspace.

    thecity schrieb:
    yorecords schrieb:
    Mir ist sowieso gerade aufgefallen, dass sich in diesem Fall komischerweise mit Decimal auch nichts ändert...

    wenn du decimal einen Float/Double übergibst hasst du schon beim deklarieren die ungenaugkeit drinnen(Die dann aber genau ist ;)).

    Also ich arbeite soweit es möglich ist mit ints, das ist eigentlich immer die bessere wahl und wenn das nicht geht einfach floats und dann runden. Decimal hat halt den nachteil das es vergleichsweise Langsam ist.


    Oh ja genau... An sich ist Decimal ja dann vollkommen unsinnig... Da man keine Zahl als Decimal deklarieren kann rechnet man wie du schon gesagt hast sowieso immer mit falschen Werten...
    Das mit dem Runden ist halt so eine Sache. Funktioniert leider nicht immer, bei meinem derzeitigen Projekt jedenfalls nicht. Anscheinend ist das schwieriger als ich dachte.
    Gibt es dann eigentlich irgend eine Möglichkeit mit genauen Werten zu rechnen? Ich muss unbedingt exakte Zeitangaben rausbekommen, mit denen man dann auch weiter rechnen kann. Die Schnelligkeit spielt in diesem Fall nur eine periphere Rolle..
    Und warum ist es eigentlich nicht möglich Werte von Anfang an als Decimal zu deklarieren?
  7. du musst bei decimal den betrag vor dem komma und den danach getrennt angeben, (als ints) dann kannst du genau mit Decimal rechnen.
  8. Hallo yorecords,

    man kann Werte von Anfang an als decimal deklarieren. Dazu musst Du nur ein 'm' dranhängen:
    decimal x = 1.522m;

    Nun zum eigentlichen Thema:
    Was berechnest Du denn eigentlich (+, -, *, / oder auch sin(), cos(), log(), sqrt() etc.) und was verstehst Du unter 'exakte Zeitangabe' (+/-1s, +/-1ms, +/-1µs). Wie groß ist den der Gesamte zu betrachtende Zeitraum (1 Jahr, 100 Jahre, Millionen Jahre, ...)?
    Man hat ja bei double bereits 15 signifikante Stellen, d.h. bei einer Genauigkeit von +/-1µs sollte sich ja innerhalb eines Zeitraumes von 31 Jahren halbwegs exakt rechnen lassen.
    Wenn Du ein paar Infos rausrückst, kann man vielleicht auch eine Lösung finden.

    Edit:
    Hast Du Dir schonmal den DateTime-Type angeschaut?


    Beitrag zuletzt geändert: 23.9.2012 15:49:06 von darkpandemic
  9. übrigens ergibt sich somit pro jahr fast die real vorhandene schaltsekunde^^ (ok, 0,86 oder so sinds)


    wenn es um große zeitgeschichten geht einfach in ganzzahlen umrechnen und solche sachen wegkürzen lassen, allerdings berücksichtigen, dass auch bei 0.99 das int runtergebrochen wird...

    und da es eh eine allgemeine klasse ist für umrechnungen, dann gibst du als rückgabewert einfach feste einheiten raus... wenn du einen timestamp umwandelst, sollte eh kein komma rauskommen, wenn du die einzelbestandteile sauber rausholst, oder du machst was verkehrt...

    modulooperationen würden sinn machen...

    struct TTime {
      long int timestamp;  //wegen konstruktoren unterscheidung
    
     int year;
     int month;
     int day;
     int hour;
     int minute;
     int second;
    
     TTime(long int input_timestamp) {
     timestamp =  input_timestamp;
    
     second = input_timestamp%60;   //sekunden rausziehen
     input_timestamp -= second;
    
     minute = input_timestamp%60;
     input_timestamp -= minute;
    
     hour =  input_timestamp%24;
     input_timestamp -= hour;
     
     .
    .
    //ab hier funktionsaufrufe, um die tage monate und jahre seit 01.01.1970 sauber rauszufiltern...
    // ist aber auch sauber mathematisch zu lösen mit modulo  
    
     
     }
    
    
    }


    das war jetzt einfach mal vereinfacht dargestellt... wenn du mehrere konstruktoren schreibst, macht es sinn, funktionen auszulagern, damit du die konstruktoren in eine zeile chainen kannst.

    damit kommst du um rundungsoperationen sauber drumherum und in der entsprechenden sprache geschrieben, sparst du auch CPU Zeit^^
  10. Autor dieses Themas

    yorecords

    Kostenloser Webspace von yorecords

    yorecords hat kostenlosen Webspace.

    Danke für eure Antworten!

    Ich hab das Problem mittlerweile schon mit einer eigenen ZeitKlasse gelöst. Das Problem war, dass z.B. periodische Zahlen nicht so dargestellt werden können, dass sie beim erneuten Umrechnen wieder die exakt gleiche Zahl ergeben.. Also wenn man z.B. 1 Sekunde in Wochen umwandelt und das dann wieder zurückwandelt wahrscheinlich irgendwas bei 0.99999998 Sekunden rauskommt..

    darkpandemic schrieb:
    Hallo yorecords,

    man kann Werte von Anfang an als decimal deklarieren. Dazu musst Du nur ein 'm' dranhängen:
    decimal x = 1.522m;



    Stimmt, das hatte ich schon wieder vergessen...

  11. 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!