# Java ==> C : isNaN()



## Leroy42 (18. Jan 2008)

Ich muß ein Java-Programm nach C übersetzen (genauer Assembler). 
Frage: In Java gibt es ja den Zahlenwert NaN (z.b. acos(1.2)) 
Wie kann man in C abfragen, ob eine Berechnung etwas _nicht existentes_ geliefert hat.

In Java geht ja einfach Double.isNaN(doubleWert).

Wie geht das in C?


----------



## DP (18. Jan 2008)

http://www.nersc.gov/vendor_docs/ibm/asm/floating.htm


----------



## Guest (18. Jan 2008)

> Operations involving infinities produce results obeying traditional
> mathematical conventions. NaNs have no mathematical interpretation. Their
> encoding permits a variable diagnostic information field. They may be used to
> indicate uninitialized variables and can be produced by certain invalid
> operations.



Okay, aber wie kann ich das jetzt in C abfragen?

_if (value == NAN)_ mit inkludieren einer entsprechenden Header-Datei?
Exceptions werden in C ja nicht geworfen.

Oder schlägt hier wieder die Variable _errno_ zu


```
double result = acos(argument)
if (errno != 0)
  // Tja, das war wohl nix!
else
  // Glück gehabt.
```


----------



## Leroy42 (18. Jan 2008)

Uuups: Ich war das, wurde nicht automatisch eingeloggt.


----------



## me1357 (18. Jan 2008)

```
#include <math.h>
#include <stdio.h>

int main ()
{
	double result;

	result = acos(1.2);
	if (isnan(result))
		printf("Error\n");
}
```

Macht genau das, was ich von dem Code erwarten würde.


----------



## Leroy42 (18. Jan 2008)

Toll! In Java; weiß ich auch.

Aber meine Frage war, wie ich das in C umsetzen kann

Edit: Sorry, habe überlesen, daß du ja in C gecodet hast


----------



## Leroy42 (18. Jan 2008)

```
result = acos(1.2); 
   if (isnan(result))
```


Aha! Ist isnan() jetzt in math.h? Was passiert, wenn ich noch weitere Berechnungen hinterschiebe?

```
result = acos(1.2); 
   result += 0.2;
   if (isnan(result))
```
??

Klappt das dann immer noch?

Oder anders gefragt:

Ist NaN+_correct double_ immer noch == NaN??


----------



## Leroy42 (18. Jan 2008)

Noch mal 'ne andere Frage:

Gibt's für (ANSI) C auch sowas ähnliches wie die Java API oder die JLS wo ich
derlei Fragen selbst heraussuchen kann?


----------



## DP (18. Jan 2008)

hmm... ganz andere frage:

was ist der unterschied zwischen

a) www.java-forum.org

und

b) www.c-plusplus.de

?


----------



## me1357 (18. Jan 2008)

Leroy42 hat gesagt.:
			
		

> Aha! Ist isnan() jetzt in math.h?


Laut C99 ist isnan() wohl ein Makro, das in math.h definiert wird.



> Ist NaN+_correct double_ immer noch == NaN??


Also ich habs hier einmal kurz probiert, scheint so zu sein.


----------



## JavaFred (18. Jan 2008)

Da NaN die einzige "Zahl" ist, die ungleich jeder anderen Zahl ist, kannst Du auch einfach schreiben:


```
if (value != value) printf("value ist NaN!");
```


----------



## Hilefoks (18. Jan 2008)

Leroy42 hat gesagt.:
			
		

> Ich muß ein Java-Programm nach C übersetzen (genauer Assembler).


Wenn du das Programm in Assembler brauchst, warum fragst du dann nach C Code? Oder willst du etwa den Assembler Code weiterverwenden den der C Compiler generiert?



			
				Leroy42 hat gesagt.:
			
		

> Gibt's für (ANSI) C auch sowas ähnliches wie die Java API oder die JLS wo ich
> derlei Fragen selbst heraussuchen kann?


Nein - zumindest nichts vergleichbares. Auch ist es in C nicht üblich "JavaDoc" Kommentare und Tools zu verwenden. Ein kostenloses und sehr gutes Buch zu C findest du aber online auf http://www.pronix.de.
Eine Referenz der GNU libc findet sich auf http://www.gnu.org/software/libc/manual/.



			
				Leroy42 hat gesagt.:
			
		

> _if (value == NAN)_ mit inkludieren einer entsprechenden Header-Datei?
> Exceptions werden in C ja nicht geworfen.
> 
> Oder schlägt hier wieder die Variable _errno_ zu


Nun ja - Exceptions gibt es auch in C...
in C wird ein Argumentfehler (domain error) entweder in erno angezeigt - d.h. erno wird auf EDOM gesetzt (definiert in errno.h) oder aber durch eine Fließkomma-Ausnahme. Das Verhalten steuert math_errhandling. Ist es auf MATH_ERRNO gesetzt, dann wird erno zum anzeigen des Fehlers genutzt, enthält sie MATH_ERREXCEPT wird eine Fließkomma-Ausnahme ausgelöst.

C99 definiert zudem das Funktions-Makros isnan() und das Makro NAN (in math.h). Möchtest du diese nutzen musst du darauf achten dem Compiler auch mitzuteilen das du den C99 Standard nutzen möchtest (beim gcc mit -std=c99).



			
				JavaFred hat gesagt.:
			
		

> Da NaN die einzige "Zahl" ist, die ungleich jeder anderen Zahl ist, kannst Du auch einfach schreiben:
> 
> ```
> if (value != value) printf("value ist NaN!");
> ```


Solche Annahmen sollte man in C grundsätzlich nicht treffen. Zudem sollte man alles was man in Java, z.B. über NaN, gelernt hat nicht Blind auf C übertragen.

MfG,
Hilefoks


----------



## Leroy42 (19. Jan 2008)

Hilefoks hat gesagt.:
			
		

> Leroy42 hat gesagt.:
> 
> 
> 
> ...



Nein, es geht um einen Microcontroller, für den es eine 
ANSI-C Entwicklungsumgebung gibt.


----------

