Was soll das?

ollek81

Erfahrenes Mitglied
Tach!!

Wieso geht das nicht? :
Code:
if(matrix[i][j] != 0)
  mach was;

Wieso geht der da trotzdem rein, wenn
Code:
matrix[i][j]
0 ist???

Spinnt C ne Runde? Oder hab ich wieder das totale Megabrett vorm Kopf???
Da ist noch einiges an if- und for-Zeilen vor. kann das daher kommen??
Normalerweise nicht, oder?
Wenn das ne Macke von C ist, wie bekomme ich das trotzdem hin??


MfG

ollek81
 
Frag mal Deinen Debugger, welchen Wert das Feld wirklich hat. Wenn man mit den Zeigern und Arraygrenzen nicht aufpasst, dann stehen schon mal Werte, an Orten, wo sie nicht hingehören.

Ebenso sollte man Variablen immer auf etwas Bestimmtes(oft 0) initialisieren, C macht das nicht für Dich! Wenn Du das vergessen hast, dann steht da ein Zufallswert drinnen.

Genauso solltest Du sicherstellen, dass das Array keine Fliesskommawerte (oder einen anderen Datentyp, der nicht wie ein Integer aufgebaut ist) enthält - die werden grundsätzlich nicht Null(zumindest nicht dann, wenn Du es erwartest - ist aber mehr Elektronik als Programmierung).
 
Hi!!

Die Indizes passen alle. Lief ja vorher. Hab da nur noch was rausziehen wollen.
Ein Wert ist der Stelle auch schon zugewiesen worden. Hab ihn ausgeben lassen, passte auch...

Aber wie war das mit den float-Werten?? Ich hab da auch mal anstatt 0 0.000 reingeschrieben. Hat aber auch nix gebracht...
Ein float-Wert kann nicht richtig 0 sein?? Ich hab mich auch schon gewundert, dass da ab und zu mal -0.000 steht...

Hast du denn ne Ahnung, wie ich das trotzdem hinbekomme?? Muss nämlich float sein!! Ich hab's auch schon mit <0 && >0 versucht. Hat genau so nix gebracht...


MfG

ollek81
 
Das Problem mit den Fliesskommawerten ist, dass 0 nicht im erlaubten Wertebereich liegt - überprüf also nicht, ob die Zahl 0 ist, sondern schau lieber, ob sie sehr klein ist.
Was sehr klein bedeutet hängt dabei von Deinem Wertebereich, den zu erwartenden Rundungsfehlern und den signifikanten Stellen ab(FLT_DIG, DBL_DIG und LDBL_DIG sind Konstanten, welche Dir mitteilen, wieviele Stellen das für den jeweiligen Datentyp sind).


Wenn Du absolute Genauigkeit brauchst, dann kommst Du nicht um Fixkommadarstellung herum.
 
Hmm... Hab das jetzt mal auf <=-0.000001 und >=0.000001 gestellt. Weiß noch nicht ob es läuft... Hab mein Beispiel verlegt. Grrr...
Naja, soll der Prof drüber richten :)

Danke erstmal!!!!!



ollek81

P.S.: Geht!!! Hab's gerade versucht!!

DANKE!!!
 
Zuletzt bearbeitet:
Du könntest aber auch mit ceil oder floor arbeiten!
Mit ceil wird der Wert nach oben gerundet und mit floor wird abgerundet.

Dies bedeutet, wenn Du schreibst: floor(0.00001) ergibt 0.000000!!!!

Vielleicht etwas eleganter?
 
floor(0.99) ergibt allerdings auch 0.0, obwohl hier die Rechenungenauigkeiten eher ein true für Wert!=0 rechtferigen.

Abgesehen davon scheint das Teil eines Schulbeispiels zu sein, vermutlich will der Lehrer zeigen, dass sich Fliesskomma und Überprüfung auf Gleichheit nicht besonders gut vertragen.
 
Hi!!!

Also mit eirem floor komme ich nicht klar. Der rundet ja echt 0.99 auf 0 ab. Damit kann man doch nicht rechen! Das ganze ist nämlich ein Teil von nem Gauß-Algorithmus, wo er nicht durch 0 teilen soll...
Ich lass das jetzt so mit dem <= >=. Das erfüllt seinen Zweck und ich weiß dann wenigstens immer dass 0.00000 nicht gleich 0 ist (wenigstens
nicht im PC)

Trotzdem Danke für eure Mühen!! :)


ollek81
 
Man kann mit floor ein paar andere nützliche Dinge anstellen;
z.B. Nachkomma=Wert-floor(Wert).
Zum Runden könnte man dann
GerundeterWert=((Wert-floor(Wert))>0.5)?floor(Wert)+1:floor(Wert);
schreiben.


btw - probier das mal aus:
#include<iostream.h>

int main()
{
float a=0.3,b=0.1;
if(a==b*3)
cout<<"true"<<endl;
else
cout<<"false"<<endl;
}

:eek: ;-)
 
Auch wenn du micht jetzt schlagen wirst, aber damit kann ich so spontan nix anfangen.
Dass floor sehr nützlich sein kann, glaub ich ja gerne, allerdings geht es bei mir um die "0"!! Und da kann das floor auch nicht viel dran ausrichten. Die if-verzweigung hab ich wie gesagt da reingebaut, damit der die entsprechende Reihe des Gleichungssystems nicht durch "0" teilt!!
Die Berechungsmatrix ist logischerweise ne floatmatrix. Also können da nur floatwerte drin stehen ==> also wohl irgendwie keine richtige 0.
Ich hab das jetzt halt irgendwie dahingewürgt und gut. Morgen muss ich das Ding verteidigen, dann ist die Sache gegessen... Wird eh keinem auffallen, was da steht...(Zu wenig Zeit)

Also Thx nochmal...


ollek81
 
Zurück