Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Nebeneffekt der Standardausgabe

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.02.2006, 02:40 Uhr
~doubleausgeber
Gast


Hi,

ich bin ziemlich verwirrt über einen Nebeneffekt der Standardausgabe. Folgendes ist mein Programm:


C++:
#include <stdio.h>
#include <iostream>
#include <math.h>

// Weiter vorne definiert:
typedef double t_floatingNumber;
struct Gaussian
{
    t_floatingNumber mean;
    t_floatingNumber sigma;
} ;
Gaussian g;
t_floatingNumber arg_enum;
t_floatingNumber arg_denom;
t_floatingNumber expVal;
t_floatingNumber coeff;
t_floatingNumber value;

// Die Problemmethode:
t_floatingNumber DistGaussian::get(int *args)
{
    int index = 0;    
    for (int i=0; i < this->paramsNumber; i++) {
        index += (args[i+1]-1) * rowSizes[i];
    }
    g = paramValues[index];    
    arg_enum = pow((args[0] - g.mean), 2);
    arg_denom = 2. * pow(g.sigma, 2);

        // for debugging only
    if (args[0]==4 && args[1]==596 && args[2]==4) {
        printf("Diese Zeile führt zur Verwirrung!\n");         //  (*)
    }

    if (arg_denom != 0.) {                                         //  (**)
        expVal = exp(- arg_enum / arg_denom);
        coeff = 1.f / (sqrtf(2. * PI) * g.sigma);
        value = coeff * expVal;            
        return value;
    }
        else {
                 ...
        }
}



Das Problem ist der Test "arg_denom != 0" (**). Für mein Beispiel "args[0]==4 && args[1]==596 && args[2]==4" ist arg_denom tatsächlich 0 (denn g.mean=0; dass das stimmt, hab ich überprüft).

Falls die Zeile (*) drin steht, funktioniert alles wie geplant (geht in den else-Block).

Falls ich aber die Zeile (*) rauslasse, geht das Programm in den if-Block (**) rein, d.h.: arg_denom != 0 gibt true zurück, obwohl arg_denom=0 ist. Alles, was ich in (*) mache, ist einen String ausgeben, der überhaupt nichts mit arg_denom zu tun hat. Wie kann das die Handhabung von arg_denom beeinflussen???

In (*) kann ich genauso gut std::cout verwenden mit demselben Effekt.

Witzig ist auch, wenn ich (*) weglasse und arg_denom im if-Block (**) ausgeben lasse, also:



C++:
    if (arg_denom != 0.) {                                         //  (**)
                 std::cout << arg_denom << std::endl;
        expVal = exp(- arg_enum / arg_denom);
        coeff = 1.f / (sqrtf(2. * PI) * g.sigma);
        value = coeff * expVal;            
        return value;
    }



Da gibt er nämlich "0" aus, also im Gegensatz zur if-Bedingung!

Hat irgendeiner von Euch nen Plan, was da abläuft? Irgendwas Komisches mit der Double-Darstellung vielleicht?

Vielen Dank für Eure Hilfe im voraus!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.02.2006, 07:18 Uhr
Tommix



'Morgen,
wahrscheinlich ist arg_denom = 0.0000001 oder so. Gleitkommazahlen sollte man niemals auf Gleichheit testen, sondern immer einen gewissen Bereich zulassen:

C++:
const double eps = 0.001;
if (fabs(arg_demon) < eps)
  std::cout << "arg_denom ist ungefaehr 0." << std::endl;


Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.02.2006, 12:55 Uhr
hagenM1



Danke, Tommix. Jetzt funktioniert's.

Trotzdem find ich es ziemlich komisch, dass die Ausgabe eines x-beliebigen Strings das Verhalten des "(arg_denom != 0.)"-Vergleichs beeinflusst. Denn dann hat der Vergleich direkt auf die 0 ja funktioniert. Irgendeine Idee, wieso?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.02.2006, 17:35 Uhr
BoBtheREapER
kein job für nen BoB


das problem bei gleitkommerzahlen ist ganz einfach dass man andauernd rundungsfehler bekommt
--
"Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir nicht ganz sicher." - Albert Einstein
www.blue-xenon.de.vu
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: