/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
undefined reference to `isfinite'
Fra : Peter Botker Frederi~


Dato : 27-09-03 17:09

Naar jeg proever at compile en fil der bruger en macro i math.h som f.eks.
int isfinite(float-type x)
saa faar jeg fejlen:
undefined reference to `isfinite'
Jeg kan godt bruge funktioner fra math.h, f.eks. abs()

Jeg har proevet at tilfoeje -lm:
gcc filnavn -lm
som vist burde faa gcc til at linke med math biblioteket, men jeg faar
stadig samme fejl.
Nogen forslag til hvad jeg goer forkert?

Peter Frederiksen

 
 
Bertel Brander (27-09-2003)
Kommentar
Fra : Bertel Brander


Dato : 27-09-03 22:26

Peter Botker Frederiksen wrote:
> Naar jeg proever at compile en fil der bruger en macro i math.h som f.eks.
> int isfinite(float-type x)
> saa faar jeg fejlen:
> undefined reference to `isfinite'
> Jeg kan godt bruge funktioner fra math.h, f.eks. abs()
>
> Jeg har proevet at tilfoeje -lm:
> gcc filnavn -lm
> som vist burde faa gcc til at linke med math biblioteket, men jeg faar
> stadig samme fejl.
> Nogen forslag til hvad jeg goer forkert?

Hvis isfinite er en macro (og det er den ifølge C99) skal den netop ikke
være i et bibliotek.

Jeg kan tænke mig til følgende fejl:

1: Du har ikke inkluderet math.h

2: Din version af gcc er en C89 compiler, og isfinite er ikke
defineret i C89. Du kan checke version af gcc vha "gcc --version",
så vidt jeg ved skal du have en gcc 3.xx for at den understøtter
c99.

Får du nogen warnings når du kompilerer? Bruger du -W -Wall når du
kompilerer?

/b


Peter Frederiksen (28-09-2003)
Kommentar
Fra : Peter Frederiksen


Dato : 28-09-03 08:54

Bertel Brander wrote:

> Peter Botker Frederiksen wrote:
>> Naar jeg proever at compile en fil der bruger en macro i math.h som
>> f.eks. int isfinite(float-type x)
>> saa faar jeg fejlen:
>> undefined reference to `isfinite'
>> Jeg kan godt bruge funktioner fra math.h, f.eks. abs()
>>
>> Jeg har proevet at tilfoeje -lm:
>> gcc filnavn -lm
>> som vist burde faa gcc til at linke med math biblioteket, men jeg faar
>> stadig samme fejl.
>> Nogen forslag til hvad jeg goer forkert?
>
> Hvis isfinite er en macro (og det er den ifølge C99) skal den netop ikke
> være i et bibliotek.
>
> Jeg kan tænke mig til følgende fejl:
>
> 1: Du har ikke inkluderet math.h
>

Jo, den er inkluderet.

> 2: Din version af gcc er en C89 compiler, og isfinite er ikke
> defineret i C89. Du kan checke version af gcc vha "gcc --version",
> så vidt jeg ved skal du have en gcc 3.xx for at den understøtter
> c99.
>

Jeg bruger version 3.1.1

> Får du nogen warnings når du kompilerer? Bruger du -W -Wall når du
> kompilerer?
>
> /b

Hvis jeg bruger -W -Wall får jeg denne warning:
implicit declaration of function 'isfinite'

Og med eller uden -W -Wall får jeg:
undefined reference to 'infinite'
i linkerfasen.


Jeg havde samme problem da jeg skulle bruge floor, men da var min løsning at
undgå at bruge floor:(

--
Peter Frederiksen

Bertel Brander (28-09-2003)
Kommentar
Fra : Bertel Brander


Dato : 28-09-03 13:06

Peter Frederiksen wrote:
> Bertel Brander wrote:
>
>>2: Din version af gcc er en C89 compiler, og isfinite er ikke
>>defineret i C89. Du kan checke version af gcc vha "gcc --version",
>>så vidt jeg ved skal du have en gcc 3.xx for at den understøtter
>>c99.
>>
>
>
> Jeg bruger version 3.1.1
>
>
>>Får du nogen warnings når du kompilerer? Bruger du -W -Wall når du
>>kompilerer?
>>
>>/b
>
>
> Hvis jeg bruger -W -Wall får jeg denne warning:
> implicit declaration of function 'isfinite'
>
> Og med eller uden -W -Wall får jeg:
> undefined reference to 'infinite'
> i linkerfasen.
>
>
> Jeg havde samme problem da jeg skulle bruge floor, men da var min løsning at
> undgå at bruge floor:(
>

Hvis din versioin af math.h ikke har en isinfinite macro vil kompileren
tro at det er en funktion. Warningen fra kompileren siger netop at den
ikke har nogen isinfinite macro (eller nogen prototype), den vil så
"opfinde" en isfinite funktion, som den ikke kan finde når den linker.

Fejlen kan være at version 3.1.1 af gcc ikke er fuldt C99 kompatibel
og derfor ikke har nogen isfinite macro. Prøv at finde math.h og se
om du kan finde isfinite der.

/b


Peter Frederiksen (28-09-2003)
Kommentar
Fra : Peter Frederiksen


Dato : 28-09-03 17:19

Bertel Brander wrote:

> Hvis din versioin af math.h ikke har en isinfinite macro vil kompileren
> tro at det er en funktion. Warningen fra kompileren siger netop at den
> ikke har nogen isinfinite macro (eller nogen prototype), den vil så
> "opfinde" en isfinite funktion, som den ikke kan finde når den linker.
>
> Fejlen kan være at version 3.1.1 af gcc ikke er fuldt C99 kompatibel
> og derfor ikke har nogen isfinite macro. Prøv at finde math.h og se
> om du kan finde isfinite der.
>
> /b

Her er noget fra math.h filen i /usr/include/
/*
* ISO C99 Standard: 7.12 Mathematics <math.h>
*/

/* Return nonzero value if X is not +-Inf or NaN. */
# ifdef __NO_LONG_DOUBLE_MATH
# define isfinite(x) \
(sizeof (x) == sizeof (float) ? __finitef (x) : __finite (x))
# else
# define isfinite(x) \
(sizeof (x) == sizeof (float) \
? __finitef (x) \
: sizeof (x) == sizeof (double) \
? __finite (x) : __finitel (x))
# endif

Er det denne linie der giver problemerne?
# ifdef __NO_LONG_DOUBLE_MATH

--
Peter Frederiksen

Anders J. Munch (28-09-2003)
Kommentar
Fra : Anders J. Munch


Dato : 28-09-03 18:09

"Peter Frederiksen" <peterbf@daimi.au.dk> skrev:
> Er det denne linie der giver problemerne?
> # ifdef __NO_LONG_DOUBLE_MATH

Det kan det dårligt være, for der er også en definition på isfinite i
#else-delen.

Måske er der noget galt med compiler-opsætningen, så han inkluderer en
forkert (gammel) version af math.h?

mvh. Anders




Bertel Brander (28-09-2003)
Kommentar
Fra : Bertel Brander


Dato : 28-09-03 18:49

Peter Frederiksen wrote:

> Bertel Brander wrote:
>
>
>>Hvis din versioin af math.h ikke har en isinfinite macro vil kompileren
>>tro at det er en funktion. Warningen fra kompileren siger netop at den
>>ikke har nogen isinfinite macro (eller nogen prototype), den vil så
>>"opfinde" en isfinite funktion, som den ikke kan finde når den linker.
>>
>>Fejlen kan være at version 3.1.1 af gcc ikke er fuldt C99 kompatibel
>>og derfor ikke har nogen isfinite macro. Prøv at finde math.h og se
>>om du kan finde isfinite der.
>>
>>/b
>
>
> Her er noget fra math.h filen i /usr/include/
> /*
> * ISO C99 Standard: 7.12 Mathematics <math.h>
> */
>
> /* Return nonzero value if X is not +-Inf or NaN. */
> # ifdef __NO_LONG_DOUBLE_MATH
> # define isfinite(x) \
> (sizeof (x) == sizeof (float) ? __finitef (x) : __finite (x))
> # else
> # define isfinite(x) \
> (sizeof (x) == sizeof (float) \
> ? __finitef (x) \
> : sizeof (x) == sizeof (double) \
> ? __finite (x) : __finitel (x))
> # endif
>
> Er det denne linie der giver problemerne?
> # ifdef __NO_LONG_DOUBLE_MATH
>
Som Anders skriver er det ikke her fejlen skal findes, men måske
et andet sted i math.h, eller i en anden math.h

Hvilket system (linux, windows, unix, ...) kompiler du på?
Hvilke kompiler flag bruger du?

Hvis ikke du kan finde andre løsninger, kan du måske poste hele math.h

/b
/b


Peter Frederiksen (28-09-2003)
Kommentar
Fra : Peter Frederiksen


Dato : 28-09-03 21:02

Bertel Brander wrote:

>>
>> Er det denne linie der giver problemerne?
>> # ifdef __NO_LONG_DOUBLE_MATH
>>
> Som Anders skriver er det ikke her fejlen skal findes, men måske
> et andet sted i math.h, eller i en anden math.h
Hvordan ser man hvilken fil der linkes til?

>
> Hvilket system (linux, windows, unix, ...) kompiler du på?
> Hvilke kompiler flag bruger du?

Her hjemme bruger jeg linux(Gentoo), men jeg har også prøvet på uni
(datalogisk institut i Århus) og der får jeg samme fejl.
Jeg bruger faktisk ikke andre flag en -lm.
>
> Hvis ikke du kan finde andre løsninger, kan du måske poste hele math.h
Ok, here it comes:


/* Declarations for math functions.
Copyright (C) 1991-1993,1995-1999,2001,2002 Free Software Foundation,
Inc.
This file is part of the GNU C Library.

The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */

/*
* ISO C99 Standard: 7.12 Mathematics <math.h>
*/

#ifndef _MATH_H
#define _MATH_H 1

#include <features.h>

__BEGIN_DECLS

/* Get machine-dependent HUGE_VAL value (returned on overflow).
On all IEEE754 machines, this is +Infinity. */
#include <bits/huge_val.h>

/* Get machine-dependent NAN value (returned for some domain errors). */
#ifdef __USE_ISOC99
# include <bits/nan.h>
#endif
/* Get general and ISO C99 specific information. */
#include <bits/mathdef.h>


/* The file <bits/mathcalls.h> contains the prototypes for all the
actual math functions. These macros are used for those prototypes,
so we can easily declare each function as both `name' and `__name',
and can declare the float versions `namef' and `__namef'. */

#define __MATHCALL(function,suffix, args) \
__MATHDECL (_Mdouble_,function,suffix, args)
#define __MATHDECL(type, function,suffix, args) \
__MATHDECL_1(type, function,suffix, args); \
__MATHDECL_1(type, __CONCAT(__,function),suffix, args)
#define __MATHCALLX(function,suffix, args, attrib) \
__MATHDECLX (_Mdouble_,function,suffix, args, attrib)
#define __MATHDECLX(type, function,suffix, args, attrib) \
__MATHDECL_1(type, function,suffix, args) __attribute__ (attrib); \
__MATHDECL_1(type, __CONCAT(__,function),suffix, args) __attribute__
(attrib)
#define __MATHDECL_1(type, function,suffix, args) \
extern type __MATH_PRECNAME(function,suffix) args __THROW

#define _Mdouble_ double
#define __MATH_PRECNAME(name,r) __CONCAT(name,r)
# define _Mdouble_BEGIN_NAMESPACE __BEGIN_NAMESPACE_STD
# define _Mdouble_END_NAMESPACE __END_NAMESPACE_STD
#include <bits/mathcalls.h>
#undef _Mdouble_
#undef _Mdouble_BEGIN_NAMESPACE
#undef _Mdouble_END_NAMESPACE
#undef __MATH_PRECNAME

#if defined __USE_MISC || defined __USE_ISOC99


/* Include the file of declarations again, this time using `float'
instead of `double' and appending f to each function name. */

# ifndef _Mfloat_
# define _Mfloat_ float
# endif
# define _Mdouble_ _Mfloat_
# ifdef __STDC__
# define __MATH_PRECNAME(name,r) name##f##r
# else
# define __MATH_PRECNAME(name,r) name/**/f/**/r
# endif
# define _Mdouble_BEGIN_NAMESPACE __BEGIN_NAMESPACE_C99
# define _Mdouble_END_NAMESPACE __END_NAMESPACE_C99
# include <bits/mathcalls.h>
# undef _Mdouble_
# undef _Mdouble_BEGIN_NAMESPACE
# undef _Mdouble_END_NAMESPACE
# undef __MATH_PRECNAME

# if (__STDC__ - 0 || __GNUC__ - 0) && !defined __NO_LONG_DOUBLE_MATH
/* Include the file of declarations again, this time using `long double'
instead of `double' and appending l to each function name. */

# ifndef _Mlong_double_
# define _Mlong_double_ long double
# endif
# define _Mdouble_ _Mlong_double_
# ifdef __STDC__
# define __MATH_PRECNAME(name,r) name##l##r
# else
# define __MATH_PRECNAME(name,r) name/**/l/**/r
# endif
# define _Mdouble_BEGIN_NAMESPACE __BEGIN_NAMESPACE_C99
# define _Mdouble_END_NAMESPACE __END_NAMESPACE_C99
# include <bits/mathcalls.h>
# undef _Mdouble_
# undef _Mdouble_BEGIN_NAMESPACE
# undef _Mdouble_END_NAMESPACE
# undef __MATH_PRECNAME

# endif /* __STDC__ || __GNUC__ */

#endif /* Use misc or ISO C99. */
#undef __MATHDECL_1
#undef __MATHDECL
#undef __MATHCALL


#if defined __USE_MISC || defined __USE_XOPEN
/* This variable is used by `gamma' and `lgamma'. */
extern int signgam;
#endif


/* ISO C99 defines some generic macros which work on any data type. */
#if __USE_ISOC99

/* Get the architecture specific values describing the floating-point
evaluation. The following symbols will get defined:

float_t floating-point type at least as wide as `float' used
to evaluate `float' expressions
double_t floating-point type at least as wide as `double' used
to evaluate `double' expressions

FLT_EVAL_METHOD
Defined to
0 if `float_t' is `float' and `double_t' is `double'
1 if `float_t' and `double_t' are `double'
2 if `float_t' and `double_t' are `long double'
else `float_t' and `double_t' are unspecified

INFINITY representation of the infinity value of type `float'

FP_FAST_FMA
FP_FAST_FMAF
FP_FAST_FMAL
If defined it indicates that the `fma' function
generally executes about as fast as a multiply and an add.
This macro is defined only iff the `fma' function is
implemented directly with a hardware multiply-add instructions.

FP_ILOGB0 Expands to a value returned by `ilogb (0.0)'.
FP_ILOGBNAN Expands to a value returned by `ilogb (NAN)'.

DECIMAL_DIG Number of decimal digits supported by conversion between
decimal and all internal floating-point formats.

*/

/* All floating-point numbers can be put in one of these categories. */
enum
{
FP_NAN,
# define FP_NAN FP_NAN
FP_INFINITE,
# define FP_INFINITE FP_INFINITE
FP_ZERO,
# define FP_ZERO FP_ZERO
FP_SUBNORMAL,
# define FP_SUBNORMAL FP_SUBNORMAL
FP_NORMAL
# define FP_NORMAL FP_NORMAL
};

/* Return number of classification appropriate for X. */
# ifdef __NO_LONG_DOUBLE_MATH
# define fpclassify(x) \
(sizeof (x) == sizeof (float) ? __fpclassifyf (x) : __fpclassify (x))
# else
# define fpclassify(x) \
(sizeof (x) == sizeof (float) \
? __fpclassifyf (x) \
: sizeof (x) == sizeof (double) \
? __fpclassify (x) : __fpclassifyl (x))
# endif

/* Return nonzero value if sign of X is negative. */
# ifdef __NO_LONG_DOUBLE_MATH
# define signbit(x) \
(sizeof (x) == sizeof (float) ? __signbitf (x) : __signbit (x))
# else
# define signbit(x) \
(sizeof (x) == sizeof (float) \
? __signbitf (x) \
: sizeof (x) == sizeof (double) \
? __signbit (x) : __signbitl (x))
# endif

/* Return nonzero value if X is not +-Inf or NaN. */
# ifdef __NO_LONG_DOUBLE_MATH
# define isfinite(x) \
(sizeof (x) == sizeof (float) ? __finitef (x) : __finite (x))
# else
# define isfinite(x) \
(sizeof (x) == sizeof (float) \
? __finitef (x) \
: sizeof (x) == sizeof (double) \
? __finite (x) : __finitel (x))
# endif

/* Return nonzero value if X is neither zero, subnormal, Inf, nor NaN. */
# define isnormal(x) (fpclassify (x) == FP_NORMAL)

/* Return nonzero value if X is a NaN. We could use `fpclassify' but
we already have this functions `__isnan' and it is faster. */
# ifdef __NO_LONG_DOUBLE_MATH
# define isnan(x) \
(sizeof (x) == sizeof (float) ? __isnanf (x) : __isnan (x))
# else
# define isnan(x) \
(sizeof (x) == sizeof (float) \
? __isnanf (x) \
: sizeof (x) == sizeof (double) \
? __isnan (x) : __isnanl (x))
# endif

/* Return nonzero value is X is positive or negative infinity. */
# ifdef __NO_LONG_DOUBLE_MATH
# define isinf(x) \
(sizeof (x) == sizeof (float) ? __isinff (x) : __isinf (x))
# else
# define isinf(x) \
(sizeof (x) == sizeof (float) \
? __isinff (x) \
: sizeof (x) == sizeof (double) \
? __isinf (x) : __isinfl (x))
# endif

/* Bitmasks for the math_errhandling macro. */
# define MATH_ERRNO 1 /* errno set by math functions. */
# define MATH_ERREXCEPT 2 /* Exceptions raised by math functions. */

#endif /* Use ISO C99. */

#ifdef __USE_MISC
/* Support for various different standard error handling behaviors. */
typedef enum
{
_IEEE_ = -1, /* According to IEEE 754/IEEE 854. */
_SVID_, /* According to System V, release 4. */
_XOPEN_, /* Nowadays also Unix98. */
_POSIX_,
_ISOC_ /* Actually this is ISO C99. */
} _LIB_VERSION_TYPE;

/* This variable can be changed at run-time to any of the values above to
affect floating point error handling behavior (it may also be necessary
to change the hardware FPU exception settings). */
extern _LIB_VERSION_TYPE _LIB_VERSION;
#endif


#ifdef __USE_SVID
/* In SVID error handling, `matherr' is called with this description
of the exceptional condition.

We have a problem when using C++ since `exception' is a reserved
name in C++. */
# ifdef __cplusplus
struct __exception
# else
struct exception
# endif
{
int type;
char *name;
double arg1;
double arg2;
double retval;
};

# ifdef __cplusplus
extern int matherr (struct __exception *__exc) throw ();
# else
extern int matherr (struct exception *__exc);
# endif

# define X_TLOSS 1.41484755040568800000e+16

/* Types of exceptions in the `type' field. */
# define DOMAIN 1
# define SING 2
# define OVERFLOW 3
# define UNDERFLOW 4
# define TLOSS 5
# define PLOSS 6

/* SVID mode specifies returning this large value instead of infinity. */
# define HUGE 3.40282347e+38F

#else /* !SVID */

# ifdef __USE_XOPEN
/* X/Open wants another strange constant. */
# define MAXFLOAT 3.40282347e+38F
# endif

#endif /* SVID */


/* Some useful constants. */
#if defined __USE_BSD || defined __USE_XOPEN
# define M_E 2.7182818284590452354 /* e */
# define M_LOG2E 1.4426950408889634074 /* log_2 e */
# define M_LOG10E 0.43429448190325182765 /* log_10 e */
# define M_LN2 0.69314718055994530942 /* log_e 2 */
# define M_LN10 2.30258509299404568402 /* log_e 10 */
# define M_PI 3.14159265358979323846 /* pi */
# define M_PI_2 1.57079632679489661923 /* pi/2 */
# define M_PI_4 0.78539816339744830962 /* pi/4 */
# define M_1_PI 0.31830988618379067154 /* 1/pi */
# define M_2_PI 0.63661977236758134308 /* 2/pi */
# define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */
# define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
# define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
#endif

/* The above constants are not adequate for computation using `long
double's.
Therefore we provide as an extension constants with similar names as a
GNU extension. Provide enough digits for the 128-bit IEEE quad. */
#ifdef __USE_GNU
# define M_El 2.7182818284590452353602874713526625L /* e */
# define M_LOG2El 1.4426950408889634073599246810018921L /* log_2 e */
# define M_LOG10El 0.4342944819032518276511289189166051L /* log_10 e */
# define M_LN2l 0.6931471805599453094172321214581766L /* log_e 2 */
# define M_LN10l 2.3025850929940456840179914546843642L /* log_e 10 */
# define M_PIl 3.1415926535897932384626433832795029L /* pi */
# define M_PI_2l 1.5707963267948966192313216916397514L /* pi/2 */
# define M_PI_4l 0.7853981633974483096156608458198757L /* pi/4 */
# define M_1_PIl 0.3183098861837906715377675267450287L /* 1/pi */
# define M_2_PIl 0.6366197723675813430755350534900574L /* 2/pi */
# define M_2_SQRTPIl 1.1283791670955125738961589031215452L /* 2/sqrt(pi) */
# define M_SQRT2l 1.4142135623730950488016887242096981L /* sqrt(2) */
# define M_SQRT1_2l 0.7071067811865475244008443621048490L /* 1/sqrt(2) */
#endif


/* When compiling in strict ISO C compatible mode we must not use the
inline functions since they, among other things, do not set the
`errno' variable correctly. */
#if defined __STRICT_ANSI__ && !defined __NO_MATH_INLINES
# define __NO_MATH_INLINES 1
#endif

/* Get machine-dependent inline versions (if there are any). */
#ifdef __USE_EXTERN_INLINES
# include <bits/mathinline.h>
#endif


#if __USE_ISOC99
/* ISO C99 defines some macros to compare number while taking care
for unordered numbers. Since many FPUs provide special
instructions to support these operations and these tests are
defined in <bits/mathinline.h>, we define the generic macros at
this late point and only if they are not defined yet. */

/* Return nonzero value if X is greater than Y. */
# ifndef isgreater
# define isgreater(x, y) \
(__extension__ \
({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
!isunordered (__x, __y) && __x > __y; }))
# endif

/* Return nonzero value if X is greater than or equal to Y. */
# ifndef isgreaterequal
# define isgreaterequal(x, y) \
(__extension__ \
({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
!isunordered (__x, __y) && __x >= __y; }))
# endif

/* Return nonzero value if X is less than Y. */
# ifndef isless
# define isless(x, y) \
(__extension__ \
({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
!isunordered (__x, __y) && __x < __y; }))
# endif

/* Return nonzero value if X is less than or equal to Y. */
# ifndef islessequal
# define islessequal(x, y) \
(__extension__ \
({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
!isunordered (__x, __y) && __x <= __y; }))
# endif

/* Return nonzero value if either X is less than Y or Y is less than X. */
# ifndef islessgreater
# define islessgreater(x, y) \
(__extension__ \
({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \
!isunordered (__x, __y) && (__x < __y || __y < __x); }))
# endif

/* Return nonzero value if arguments are unordered. */
# ifndef isunordered
# define isunordered(u, v) \
(__extension__ \
({ __typeof__(u) __u = (u); __typeof__(v) __v = (v); \
fpclassify (__u) == FP_NAN || fpclassify (__v) == FP_NAN; }))
# endif

#endif

__END_DECLS


#endif /* math.h */

--
Peter Frederiksen

Bertel Brander (28-09-2003)
Kommentar
Fra : Bertel Brander


Dato : 28-09-03 22:25

Peter Frederiksen wrote:
> Bertel Brander wrote:
>
>
>>>Er det denne linie der giver problemerne?
>>># ifdef __NO_LONG_DOUBLE_MATH
>>>
>>
>>Som Anders skriver er det ikke her fejlen skal findes, men måske
>>et andet sted i math.h, eller i en anden math.h
>
> Hvordan ser man hvilken fil der linkes til?
Du kan bruge compiler switchen -nostdinc, der fortæller gcc at den
ikke skal bruge standard path til include filerne, og så bruge
-I...\whatever til at fortælle den hvor den skal lede efter filerne.
>
>
>>Hvilket system (linux, windows, unix, ...) kompiler du på?
>>Hvilke kompiler flag bruger du?
>
>
> Her hjemme bruger jeg linux(Gentoo), men jeg har også prøvet på uni
> (datalogisk institut i Århus) og der får jeg samme fejl.
> Jeg bruger faktisk ikke andre flag en -lm.
Du bør mindst bruge -W -Wall for at se warnings.
>
>>Hvis ikke du kan finde andre løsninger, kan du måske poste hele math.h
>
> Ok, here it comes:
>
I linie ca. 132 er der en #if __USE_ISOC99, isfinite macro'en er
indenfor denne. Medmindre at du har en "#define __USE_ISOC99 1" før
"#include <math.h>" eller -D__USE_ISOC99=1 på kommando linien kan
kompileren ikke se isfinite macro'en.

Jeg kender dog ikke nok til gcc til at vide om det er den rigtige måde
at løse problemet.

/b


Michael Rasmussen (28-09-2003)
Kommentar
Fra : Michael Rasmussen


Dato : 28-09-03 23:11


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:3f77512f$0$97227$edfadb0f@dread12.news.tele.dk...
> I linie ca. 132 er der en #if __USE_ISOC99, isfinite macro'en er
> indenfor denne. Medmindre at du har en "#define __USE_ISOC99 1" før
> "#include <math.h>" eller -D__USE_ISOC99=1 på kommando linien kan
> kompileren ikke se isfinite macro'en.
>
> Jeg kender dog ikke nok til gcc til at vide om det er den rigtige måde
> at løse problemet.

Jeg mener at huske at der er en compilations switch til at slå gcc over i
C99 mode.
Prøv at køre 'gcc -v --help' og check efter.

Med venlig hilsen
Michael Rasmussen



Peter Jensen (29-09-2003)
Kommentar
Fra : Peter Jensen


Dato : 29-09-03 12:28

Michael Rasmussen wrote:

>> Jeg kender dog ikke nok til gcc til at vide om det er den rigtige
>> måde at løse problemet.
>
> Jeg mener at huske at der er en compilations switch til at slå gcc
> over i C99 mode.

Jep. Den hedder '-std=c99'.

> Prøv at køre 'gcc -v --help' og check efter.

Og hvis manualen er installeret (det burde den være), så får man nok
bedre hjælp fra 'man gcc'.

--
PeKaJe

Let me put it this way: today is going to be a learning experience.

Anders J. Munch (28-09-2003)
Kommentar
Fra : Anders J. Munch


Dato : 28-09-03 18:08

"Peter Frederiksen" <peterbf@daimi.au.dk> skrev:
> Hvis jeg bruger -W -Wall får jeg denne warning:
> implicit declaration of function 'isfinite'
>

Betragt altid denne warning som en fejl. Det tjener aldrig noget
fornuftigt formål at kalde en uerklæret funktion. At det overhovedet
kan lade sig gøre i C er historisk betinget.

mvh. Anders




Per Abrahamsen (29-09-2003)
Kommentar
Fra : Per Abrahamsen


Dato : 29-09-03 12:04

Peter Botker Frederiksen <peterbf@daimi.au.dk> writes:

> Naar jeg proever at compile en fil der bruger en macro i math.h som f.eks.
> int isfinite(float-type x)
> saa faar jeg fejlen:
> undefined reference to `isfinite'
> Jeg kan godt bruge funktioner fra math.h, f.eks. abs()

Jeg har en mathlib.h med blandt andet:

#define _GLIBCPP_USE_C99 1
#define __USE_ISOC99 1
#include <math.h>

#if !defined (isfinite)
inline bool isfinite (double x)
{ return x <= 0.0 || x >= 0.0; }
#endif

Det sidste er ikke en korrekt definition af isfinite, men god nok til
hvad jeg bruger den til, som kun er:

assert (isfinite (x))

basalt set regner jeg kun med reelle tal, og ovenstående test fanger i
det mindste NaN's.

Per Abrahamsen (29-09-2003)
Kommentar
Fra : Per Abrahamsen


Dato : 29-09-03 12:09

Per Abrahamsen <abraham@dina.kvl.dk> writes:

> Jeg har en mathlib.h med blandt andet:
>
> #define _GLIBCPP_USE_C99 1
> #define __USE_ISOC99 1
> #include <math.h>

Jeg glemte at sige at jeg programmerer i C++, som ikke har isfinite,
derfor er ovenstående tricks nødvendige. Måske er det samme problem
du har. Faktisk programmer jeg i "C++ med C99 udvidelser" i den tro
at næste C++ standard vil have i hvert fald de C99 udvidelser der er
kompatible med C++.

Peter Frederiksen (30-09-2003)
Kommentar
Fra : Peter Frederiksen


Dato : 30-09-03 17:46

Tak for hjælpen til alle.
--
Peter Frederiksen

Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408186
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste