[C++] isinf(), isnan() & finite() odefinierade?

Permalänk

[C++] isinf(), isnan() & finite() odefinierade?

Det verkar som att isinf(), isnan() och dylikt är odefinierade i cmath för vissa kompilatorer. Det funkar fint att kompilera med MinGW men t.ex. GCC 3.4.3 på Solaris vill inte ge med sig.

Jag har sökt på google efter en förklaring och det verkar som att jag inte är helt ensam om problemet men dokumentationen jag kommit över är högst bristfällig. Det enda egentliga jag hittade var en FreeBSD-newsgroup diskuterade ämnet, men jag förstod ärligt talat inte så mycket om vad de skrev.

Är det någon som vet vad det beror av eller vad mad man kan göra åt det? Kanske är det någon som har ett tips om ett alternativt sätt att utföra samma kontroll som isinf() gör?

Permalänk
Medlem

Verkar inte vara standard C funktioner, sökte lite på Google och de verkar tillhöra BSD 4.3 kompatibla system, t.ex. så stöds dem ej av VC++.

[EDIT] Hittade detta:
"isinf confirms to ISO/IEC 9899:1999 (C99)."

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Hedersmedlem

Från manualen:

fpclassify(3) Linux Programmer's Manual fpclassify(3) NAME fpclassify, isfinite, isnormal, isnan - floating-point classification macros SYNOPSIS #include <math.h> int fpclassify(x); int isfinite(x); int isnormal(x); int isnan(x); int isinf(x); Compile with -std=c99; link with -lm. DESCRIPTION Floating point numbers can have special values, such as infinite or NaN. With the macro fpclassify(x) you can find out what type x is. The macro takes any floating-point expression as argument. The result takes one of the following values: FP_NAN x is "Not a Number". FP_INFINITE x is either plus or minus infinity. FP_ZERO x is zero. FP_SUBNORMAL x is too small to be represented in normalized format. FP_NORMAL if nothing of the above is correct that it must be a normal floating-point number. The other macros provide a short answer to some standard questions. isfinite(x) returns a nonzero value if (fpclassify(x) != FP_NAN && fpclassify(x) != FP_INFINITE) isnormal(x) returns a nonzero value if (fpclassify(x) == FP_NORMAL) isnan(x) returns a nonzero value if (fpclassify(x) == FP_NAN) isinf(x) returns a nonzero value if (fpclassify(x) == FP_INFINITE) NOTE On systems conforming to BSD 4.3, isinf() will return 1 for positive, and -1 for negative infinity. CONFORMING TO C99 SEE ALSO finite(3), INFINITY(3), isgreater(3) 2004-10-31 fpclassify(3)

Borde med andra ord inte vara så svårt att skapa dessa makron själv...

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk

Tack för svaren. Hur menar du med att skapa makron m0REc (jag är något av en nybörjare)? Menar du att isinf() t.ex. är ett makro av fpclassify()? Jag testade att använda fpclassify(x) != FP_NORMAL men med samma resultat, det fungerar fint på MinGW men inte på GCC 3.4.3. Jag har även testat att använda math.h istället för cmath men det hjälpte inte.

Permalänk
Medlem

Länkar du till libm? (gcc -lm)

Visa signatur

"`F' is group reply. This is because `G' is for sort and `g' is for get new mail. And `G' is for sort because `sort' used be called `group', and anyway `S' is for save mailbox and `s' is for file message in folder, because `f' is group reply and `F' is group reply including original text."

Permalänk

Inte i vanliga fall men jag har prövat utan förbättring. Vad är gör det egentligen?