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