unendlich



  • Gibt es ne Moeglicxhkeit in Ansi c eine Variable auf unendlich zu setzen?



  • Jein. Wenn ein double den Zustand 'unendlich' kennt, dann kann man ihn auch erzeugen. Das Makro INFINITY erzeugt einen float mit diesem Wert. HUGE_VAL* kann auch 'unendlich' sein. Sollte das nicht funktionieren, kann man die Unendlichkeit auch berechnen, zB -log(0). Überprüfen kann man übrigens mit isinf.



  • Da gibt es doch bestimmt auch eine Konstante:

    double x;
    
    x=infinity;
    

    Sowas in der Art?



  • Daniel E. schrieb:

    Das Makro INFINITY erzeugt einen float mit diesem Wert.

    @Frederik: das wird dann wohl deine konstante sein - nehm ich mal an.



  • Es geht auch so:

    #define infinity "\0\0\0\0\0\0" //Die beiden letzten Zeichen muesste man noch a la char(240)+char(255) einfuegen...
    
    int main(int argc, char* argv[]){
    	double *b;
    	unsigned char a[8];
    
    	a[0]=0;
    	a[1]=0;
    	a[2]=0;
    	a[3]=0;
    	a[4]=0;
    	a[5]=0;
    	a[6]=240;
    	a[7]=255;
    
    	b = (double *)&(a[0]);
    	// b ist nun "unendlich gross".
    	//b = (double *)infinity;
    
    	return 0;
    }
    

    An der Konstante muss ich spaeter noch ein bisschen herumbasteln...



  • Frederik: Das ist keine sonderlich gute Idee.



  • @Frederik
    Ich frag mich, was das bringen soll, was du da fabrizierst.



  • Ich suche eine Möglichkeite einem Double den Wert unendlich zuzuweisen. Wenn man sich den Rückgabewert von log(0) ansieht und zu char[7] castet sieht man welche Bits hinter unendlich stecken. Diese Bits könnte man dann dem Double zuweisen.

    Das das nicht sehr sauber aussieht weiß ich. Schließlich muß ja noch dran herumgebastelt werden;-)

    Eine einfachere Möglichkeit wäre:

    double b;
    	b=1E308*1E308;
    

    Das gibt dann aber immer eine Compiler Warnung... notfalls halt math.h einbinden und log(0) benutzen.

    @Praktikant: Ich dachte die Konstante wäre "irgendwo" definiert und würde den double auf unendlich setzen. Bei der Implementation von log haben sie das doch bestimmt auch so gemacht. if (x=0) retval=INF else....



  • Frederik schrieb:

    Es geht auch so:

    #define infinity "\0\0\0\0\0\0" //Die beiden letzten Zeichen muesste man noch a la char(240)+char(255) einfuegen...
    

    also

    #define infinity "\0\0\0\0\0\0\360\377"
    

    im stringliteral kann man mit \ oktalzahlen schreiben und mit \x hexzahlen.



  • Meiner meinung nach wäre es sehr dumm wenn man einer double Variable unendlich zuweisen könnte. Wie man bereits in der schule lernt ist unendlich keine zahl im eigentlichen sinne. double kann aber nur zahlenwerte in einnen bestimmen intervall aufnehmen.



  • da muss ich xroads42 beipflichten! selbst wenn dann die double-variable unendlich ist, kann man ja nicht damit rechnen. damit überhaupt irgendwo unendlich rauskommt, muss man ja den limes einsetzen. und das wiederum heißt ja, dass man eh mit besonderen operatoren arbeiten muss, sodass eine variable gar nicht unendlich sein muss. sondern eher eine if-anweisung, die ergibt, dass unendlich rauskommt. (alles klar? 😋)



  • Ihr habt recht:-) Ich will ja damit gar nicht rechnen. Ich möchte eine Funktion schreiben die Kennfelder einliesst. Das Prob ist nun was machste wenn die eine Zeile 10 Werte und die andere Zeile nur 9 Werte enthält? Weil zB. die Kennlinie in bestimmten Bereichen nicht definiert ist. -> Unendlich setzen, damit mit dem Wert nicht gerechnet wird. Problem gelöst.

    Viele Grüße

    Frederik



  • Doubles kennen neben unendlich auch noch den Wert NaN (Not a Number). Das wäre für dein Vorhaben vielleicht besser geeignet.



  • Wusste ich gar nicht. Wieso ist NAN = INFINITY - INFINITY?

    #ifdef INFINITIES
    double INFINITY = 1.0/0.0; /* 99e999; /
    #else
    double INFINITY = 1.79769313486231570815E308; /
    2**1024*(1-MACHEP) */
    #endif
    #ifdef NANS
    double NAN = 1.0/0.0 - 1.0/0.0;
    #else
    double NAN = 0.0;
    #endif

    Steht jedenfalls hier:
    http://search.cpan.org/src/RKOBES/Math-Cephes-0.41/libmd/const.c



  • Frederik schrieb:

    Wusste ich gar nicht. Wieso ist NAN = INFINITY - INFINITY?

    Was sollte es denn sonst sein? 0? INFINITY? -INFINITY? Nichts davon macht wirklich Sinn.



  • NaN soll ausdruecken das der Wert keiner Zahl entspricht.
    INF soll ausdruecken das die Zahl zu gross ist um dargestellt werden zu koennen.

    INF-INF ist in meinen Augen wieder INF. Wenn einmal der Zahlenbereich verlassen -> fuer immer draussen.
    Wenn ich Sprachentwickler wäre hätte ich ein extra Schluesselwort fuer NaN eingefuehrt und nicht so ein Konstrukt wie 1.0/0.0 - 1.0/0.0.
    Was ist eigentlich NaN-NaN;-)



  • Ich haets fast uebersehen: Dank Volkard ist mein ultimatives Makro jetzt fertig:

    #define INFINITY *((double *)"\0\0\0\0\0\0\360\377")
    
    int main(int argc, char* argv[]){
    	double e;
    
    	e=INFINITY;
    	printf("%f\n", e);
    	return 0;
    }
    

    Da das Gecaste während der Laufzeit stattfindet ist der Code nicht langsamer als wenn man die Bits direkt hinschreibt. Und die math.h wegen log(0) brauche ich auch nicht mehr 👍



  • Hallo Leute,

    entschuldigt das ich diesen alten Thread nochmal ausgrabe: Bei mir geht aber isinf gar nicht. Ich finde die C Funktion nicht einmal in der Doku...

    Wie kriegt man denn heraus ob ein Wert NaN, INF oder sonstwas Annormales ist?

    Viele Grüße

    Mike


Anmelden zum Antworten