Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Acid

Frischling

  • »Acid« ist der Autor dieses Themas

Beiträge: 4

Wohnort: München

  • Private Nachricht senden

1

23.01.2006, 08:34

Addition großer Zahlen mit kleinen Kommazahlen. Fehler?! c++

Hallo!

Ich habe folgendes Problem,
wenn ich dieses Programm ausführe, berechnet er alles richtig und ich bekomme 2445352.8

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include "math.h"
#include "stdio.h"
#include "stdlib.h"

int main()
{
    double y,m,B;   
    double              g_dYear, g_dMonth, g_dDay, g_dUT,g_dHour,g_dMin,g_dSec,g_dJD;

    g_dYear     = 1983.0;
    g_dMonth    = 1.0;
    g_dDay      = 18.0;             //Bereich 4-15?!

    g_dHour     = 7.0;
    g_dMin      = 12.0;
    g_dSec      = 0.0;

    g_dUT       = g_dHour + g_dMin/60.0 + g_dSec/3600.0;

    if(g_dMonth <= 2.0)
    {
        y = g_dYear-1.0;
        m = g_dMonth+12.0;
    }
    else
    {
        y = g_dYear;
        m = g_dMonth;
    }

    if(g_dYear<1582.0&&g_dMonth<10.0)           // falsch?

        B=-2.0;
    else if(g_dYear==1582.0&&g_dMonth==10.0&&g_dDay<=4.0)
        B=-2.0;
    else if(g_dYear==1582.0&&g_dMonth==10.0&&g_dDay>=15.0)
        B=floor(y/400.0)-floor(y/100.0);
    else if(g_dYear>1582.0||g_dMonth>10.0)
        B=floor(y/400.0)-floor(y/100.0);

    //tbWriteToLog("y: \t%.f \tm: \t%.f \tB: \t%.f \tUT: \t%.2f",(float)(y),(float)(m),(float)(B),(float)(g_dUT));

    
    g_dUT = g_dUT/24.0;
    printf("\t%.2lf + \t%.2lf + \t%.2lf + \t%.2lf + \t%.2lf + \t%.2lf\n",floor(365.25*y),floor(30.6001*(m+1.0)),B,g_dDay,1720996.5,g_dUT);

    g_dJD = floor(365.25*y) + 1720996.5 + floor(30.6001*(m+1.0)) + B + g_dDay + g_dUT ;
    printf("yJD: \t%.3lf\n",g_dJD);

    system("Pause");
    return 0;
}


wenn ich das ganze aber nun innerhalb einer Grafikanwendung mit der tribase engine berechne, behauptet er felsenfest,
dass es 2445352.750 ist.

Mir ist aufgefallen, dass dieses Problem nur bei Addition einer relativ großen Ganzzahl und einer relativ kleinen Kommazahl besteht.
Ausserdem springt er hinter dem Komma immer um 1/4,
dh. 0.0 0.25 0.50 0.75.

Ich versteh einfach nicht wo mein Fehler liegt und brauche dringend Hilfe,
da ich das komplette Programm blad abgeben muss!


Mit freundlichen Grüßen und vielen Dank schon mal

Acid

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

2

23.01.2006, 13:49

hmmm...
Tritt das Problem auch auf, wenn du nur float-Variablen verwendest?

Zitat

C-/C++-Quelltext

1
2
3
4
5
g_dUT = g_dUT/24.0; 
    printf("\t%.2lf + \t%.2lf + \t%.2lf + \t%.2lf + \t%.2lf + \t%.2lf\n",floor(365.25*y),floor(30.6001*(m+1.0)),B,g_dDay,1720996.5,g_dUT); 

    g_dJD = floor(365.25*y) + 1720996.5 + floor(30.6001*(m+1.0)) + B + g_dDay + g_dUT ; 
    printf("yJD: \t%.3lf\n",g_dJD);


Kann sein, dass du hier keine Konvertierung vornimmst? Du willst doublevariablen als float ausgeben, und konvertierst sie nicht? (floor gibt double zurück!)
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

3

23.01.2006, 14:04

Vielleicht weil float und double unterschiedliche Nachkommastellen haben?
float vier und duble weiß ich nicht.

F0GX

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

23.01.2006, 14:26

Das doppelte?! ^_^

Also laut VS Doku haben die .net Datentypen folgende "Maße":
float -10^38 bis 10^38 bei 7 Stellen
double -10^308 bis 10^308 bei 15 Stellen
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

5

23.01.2006, 16:09

Zitat von »"FOGX"«

Vielleicht weil float und double unterschiedliche Nachkommastellen haben?
float vier und duble weiß ich nicht.

F0GX


NAja, bei Fließkommzahlen ist das was kompizierter. Sie können hunderte von Nachkommastellen haben oder auch gar keine, jenachdem, ob die darzustellende Zahl klein oder groß ist.
Vier Nachkommstellen ist höchstens dann richtig, wenn du drei Vorkommastellen hast (wobei es auch manchmal passieren kann, dass bei vier Vorkommastellen vier Nachkommastellen richtig sind). Geh aber bei Float von 7 aus und bei double von 15, denn die sind immer Mindestens vorhanden.
Why is 6 afraid of 7?
Because 7 8 9

Acid

Frischling

  • »Acid« ist der Autor dieses Themas

Beiträge: 4

Wohnort: München

  • Private Nachricht senden

6

23.01.2006, 17:25

@ BlackPanther
Wieso konvertieren? mit %.lf geb ich doch double aus und kein float.

@Alle
Das programm läuft so wie ich es gepostet habe,
aber wenn ich es in einem größeren programm mit der tribase engine verwenden möchte,
dann fängt es an so rumzuspinnen.


Hier der Codeauschnitt aus dem "großen" Programm mit der Ausgabe in der Logfile.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// ******************************************************************

//Bestimmung des aktuellen Julianischen Datums

double GetJD()                      
{   
    //Variablen

    double y=0.0,m=0.0,B=0.0;                   //Hilfsgrößen zur Bestimmung des Julianischen Datums

    double      g_dYear=0.0, g_dMonth=0.0, g_dDay=0.0, g_dUT=0.0,g_dHour=0.0,g_dMin=0.0,g_dSec=0.0; //Teile des aktuellen Datums

    double      g_dJD=0.0;          //die aktuelle Zeit als julianisches datum


    g_dYear     = 1983.0;
    g_dMonth    = 1.0;
    g_dDay      = 18.0;             //Bereich 4-15?!


    g_dHour     = 7.0;
    g_dMin      = 12.0;
    g_dSec      = 0.0;

    g_dUT       = g_dHour + g_dMin/60.0 + g_dSec/3600.0;

    if(g_dMonth <= 2.0)
    {
        y = g_dYear-1.0;
        m = g_dMonth+12.0;
    }
    else
    {
        y = g_dYear;
        m = g_dMonth;
    }

    if(g_dYear<1582.0&&g_dMonth<10.0)           
        B=-2.0;
    else if(g_dYear==1582.0&&g_dMonth==10.0&&g_dDay<=4.0)
        B=-2.0;
    else if(g_dYear==1582.0&&g_dMonth==10.0&&g_dDay>=15.0)
        B=floor(y/400.0)-floor(y/100.0);
    else if(g_dYear>1582.0||g_dMonth>10.0)
        B=floor(y/400.0)-floor(y/100.0);

    //tbWriteToLog("y: \t%.f \tm: \t%.f \tB: \t%.f \tUT: \t%.2f",(float)(y),(float)(m),(float)(B),(float)(g_dUT));


    g_dUT = g_dUT/24.0;
    tbWriteToLog("\t%.2lf + \t%.2lf + \t%.2lf + \t%.2lf + \t%.2lf + \t%lf",floor(365.25*y),floor(30.6001*(m+1.0)),B,g_dDay,1720996.5,g_dUT);

    g_dJD = floor(365.25*y) + 1720996.0;
    tbWriteToLog("yJD1: \t%.3lf",g_dJD);
    double blubb;
    blubb = floor(30.6001*(m+1.0)) + B + g_dDay + g_dUT + 0.5;
    tbWriteToLog("blubb: \t%.3lf",blubb);
    g_dJD = g_dJD + blubb;
    tbWriteToLog("yJD2: \t%.3lf\n\n",g_dJD);

    return g_dJD;
}

Ausgabe via TribaseLogbuch
[list] 723925.00 + 428.00 + -15.00 + 18.00 + 1720996.50 + 0.300000
yJD1: 2444921.000
blubb: 431.800
yJD2: 2445352.750[/list]
Was mir hierbei auffällt ist, dass er die großen Zahlen und die kleinen Zahlen an sich richtig addiert,
aber wenn er die großen und die kleinen zusammen fassen soll
verhaut er alles hinterm Komma.

Ich werd allmälich wahnsinnig! Saß jetzt schon die ganze Nacht an dem Problem und find keine Lösung :crying:

Ich bin für jeden Vorschlag dankbar!

MfG

Acid

Acid

Frischling

  • »Acid« ist der Autor dieses Themas

Beiträge: 4

Wohnort: München

  • Private Nachricht senden

7

23.01.2006, 17:34

Hab jetzt alle Variablen von Double auf Float umgestellt,
der Fehler bleibt jedoch bestehen. :(

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

23.01.2006, 17:39

Warum denn nicht einfach int? int ist immer genau (es sei denn, Du machst einen Überlauf).

Acid

Frischling

  • »Acid« ist der Autor dieses Themas

Beiträge: 4

Wohnort: München

  • Private Nachricht senden

9

23.01.2006, 18:08

Hmm ... wie krieg ich denn bitte mit int Kommastellen her?

10

24.01.2006, 13:34

Also du proggst dir eine Klasse, die aus mehreren INTs besteht und für jede Stelle ein INT verwendet.
Das wär doch mal was, oder? ;)

Vergiss es.

Mein Tipp: Schreib die entsprechende Teile nochmal, mir ist es auch mal passiert, das ein Prog nach der Kompilation vom einen auf den anderen Moment nicht mehr (oder anders) funktioniert hat.

F0GX

Werbeanzeige