Web Server forum
Back To The Forum Home!Search!Private Messaging System

This is Interesting: Free IT Magazines Now Free shipping to   
Web Server Talk Web Server Talk > Unix and Linux reviews > Sun Solaris support > Solaris General > Solaris 10 isinf (libm) problem




  Last Thread   Next Thread Next
  Show Printable Version Email this Page Subscribe to this Thread      Post New Thread    Post A Reply      

    Solaris 10 isinf (libm) problem  
Bruno Bonfils


View Ip Address Report This Message To A Moderator Edit/Delete Message


 
07-29-05 01:08 PM


Hello,

I'm trying to build a software which use the function isinf (from
libm), I think you can guess my problem, this function doesn't exist
in libm, as it should.

first strange thing :

extract from man isinf :

SYNOPSIS
#include <math.h>

int isinf(real-floating x);

% grep isinf /usr/include/math.h
zsh: exit 1     grep isinf /usr/include/math.h
% gnm /usr/lib/libm.so | grep isinf
000828c0 t isinfl
000828c0 t __isinfl

I look for some workarounds, the only one i found is to overwrite the
functin isinf as a wrapper to infinite. Though, I don't like this
workaround, especially for code of other people.

- First, why this error/problem still exist in Solaris 10 ? My search
in google saw me that this 'error' is very old

- Is there another workaround which doesn't require to modify the code
?

Thanks to you


--
\_o<





[ Post a follow-up to this message ]



    Re: Solaris 10 isinf (libm) problem  
Thomas Maier-Komor


View Ip Address Report This Message To A Moderator Edit/Delete Message


 
07-29-05 01:08 PM

Bruno Bonfils wrote:
> Hello,
>
> I'm trying to build a software which use the function isinf (from
> libm), I think you can guess my problem, this function doesn't exist
> in libm, as it should.
>
> first strange thing :
>
> extract from man isinf :
>
> SYNOPSIS
>      #include <math.h>
>
>      int isinf(real-floating x);
>
> % grep isinf /usr/include/math.h
> zsh: exit 1     grep isinf /usr/include/math.h
> % gnm /usr/lib/libm.so | grep isinf
> 000828c0 t isinfl
> 000828c0 t __isinfl
>
> I look for some workarounds, the only one i found is to overwrite the
> functin isinf as a wrapper to infinite. Though, I don't like this
> workaround, especially for code of other people.
>
> - First, why this error/problem still exist in Solaris 10 ? My search
>   in google saw me that this 'error' is very old
>
> - Is there another workaround which doesn't require to modify the code
>   ?
>
> Thanks to you
>
>

the manpage also says that beside libm.so you have to link
agains libsunmath.so. And there you will find isinf...

Tom





[ Post a follow-up to this message ]



    Re: Solaris 10 isinf (libm) problem  
PM


View Ip Address Report This Message To A Moderator Edit/Delete Message


 
07-29-05 01:08 PM

Bruno Bonfils wrote:
> Hello,
>
> I'm trying to build a software which use the function isinf (from
> libm), I think you can guess my problem, this function doesn't exist
> in libm, as it should.
>
> first strange thing :
>
> extract from man isinf :
>
> SYNOPSIS
>      #include <math.h>
>
>      int isinf(real-floating x);
>
> % grep isinf /usr/include/math.h
> zsh: exit 1     grep isinf /usr/include/math.h

% grep ^#include /usr/include/math.h
#include <iso/math_iso.h>
#include <iso/math_c99.h>
#include <floatingpoint.h>

% grep isinf /usr/include/iso/math*
/usr/include/iso/math_c99.h:#undef     isinf
/usr/include/iso/math_c99.h:#define    isinf(x)     __builtin_isinf(x)

PM





[ Post a follow-up to this message ]



    Re: Solaris 10 isinf (libm) problem  
Casper H.S. Dik


View Ip Address Report This Message To A Moderator Edit/Delete Message


 
07-29-05 01:08 PM

Bruno Bonfils <asyd+news@asyd.net> writes:

>I'm trying to build a software which use the function isinf (from
>libm), I think you can guess my problem, this function doesn't exist
>in libm, as it should.

No it shouldn't.  It should be defined when including <math.h>

>first strange thing :

>extract from man isinf :

>SYNOPSIS
>     #include <math.h>

>     int isinf(real-floating x);

>% grep isinf /usr/include/math.h
>zsh: exit 1     grep isinf /usr/include/math.h
>% gnm /usr/lib/libm.so | grep isinf
>000828c0 t isinfl
>000828c0 t __isinfl

It's defined in iso/math_c99.h as:

#define isinf(x)        __builtin_isinf(x)

But you're probably using gcc and it's only in Solaris 11 that
gcc support is better and uses:

#if defined(__GNUC__)
#define isinf(x)        __extension__( \
{ __typeof(x) __x_i = (x); \
__x_i == (__typeof(__x_i)) INFINITY || \
__x_i == (__typeof(__x_i)) (-INFINITY); })
#else
#define isinf(x)	__builtin_isinf(x)
#endif



Casper
--
Expressed in this posting are my opinions.  They are in no way related
to opinions held by my employer, Sun Microsystems.
Statements on Sun products included here are not gospel and may
be fiction rather than truth.





[ Post a follow-up to this message ]



    Re: Solaris 10 isinf (libm) problem  
Bruno Bonfils


View Ip Address Report This Message To A Moderator Edit/Delete Message


 
07-29-05 01:08 PM

PM <pm@gmx.de> writes:

>
> % grep ^#include /usr/include/math.h
> #include <iso/math_iso.h>
> #include <iso/math_c99.h>
> #include <floatingpoint.h>
>
> % grep isinf /usr/include/iso/math*
> /usr/include/iso/math_c99.h:#undef     isinf
> /usr/include/iso/math_c99.h:#define    isinf(x)     __builtin_isinf(x)

So, why :

% cat isinf.c
#include <stdio.h>
#include <math.h>

int main (void)
{
float myfloat = 0.000;
return isinf(myfloat);
}

% gcc -Wall isinf.c -o isinf -lm
isinf.c: In function `main':
isinf.c:7: warning: implicit declaration of function `isinf'
Undefined                       first referenced
symbol                             in file
isinf                               /var/tmp//cc0mv2QJ.o
ld: fatal: Symbol referencing errors. No output written to isinf


and for Thomas :

% gcc -Wall isinf.c -o isinf -lm -lsunmath
isinf.c: In function `main':
isinf.c:7: warning: implicit declaration of function `isinf'
ld: fatal: library -lsunmath: not found
ld: fatal: File processing errors. No output written to isinf
collect2: ld returned 1 exit status
zsh: exit 1     gcc -Wall isinf.c -o isinf -lm -lsunmath


--
\_o<





[ Post a follow-up to this message ]



    Re: Solaris 10 isinf (libm) problem  
Thomas Maier-Komor


View Ip Address Report This Message To A Moderator Edit/Delete Message


 
07-29-05 01:08 PM

Bruno Bonfils wrote:
> PM <pm@gmx.de> writes:
>
> 
>
>
> So, why :
>
> % cat isinf.c
> #include <stdio.h>
> #include <math.h>
>
> int main (void)
> {
>         float myfloat = 0.000;
>         return isinf(myfloat);
> }
>
> % gcc -Wall isinf.c -o isinf -lm
> isinf.c: In function `main':
> isinf.c:7: warning: implicit declaration of function `isinf'
> Undefined                       first referenced
>  symbol                             in file
> isinf                               /var/tmp//cc0mv2QJ.o
> ld: fatal: Symbol referencing errors. No output written to isinf
>
>
> and for Thomas :
>
> % gcc -Wall isinf.c -o isinf -lm -lsunmath
> isinf.c: In function `main':
> isinf.c:7: warning: implicit declaration of function `isinf'
> ld: fatal: library -lsunmath: not found
> ld: fatal: File processing errors. No output written to isinf
> collect2: ld returned 1 exit status
> zsh: exit 1     gcc -Wall isinf.c -o isinf -lm -lsunmath
>
>

libsunmath is part of Sun Studio 10. you can get it free
of charge if you are a participant of the OpenSolaris
program - AFAIK...
Do yourself a favor in try it - it has many advantages
compared to gcc.

Tom





[ Post a follow-up to this message ]



    Re: Solaris 10 isinf (libm) problem  
Seongbae Park


View Ip Address Report This Message To A Moderator Edit/Delete Message


 
07-30-05 01:51 AM

Bruno Bonfils <asyd+news@asyd.net> wrote:
> PM <pm@gmx.de> writes:
> 
>
> So, why :
>
> % cat isinf.c
> #include <stdio.h>
> #include <math.h>
>
> int main (void)
> {
>         float myfloat = 0.000;
>         return isinf(myfloat);
> }
>
> % gcc -Wall isinf.c -o isinf -lm
> isinf.c: In function `main':
> isinf.c:7: warning: implicit declaration of function `isinf'
> Undefined                       first referenced
>  symbol                             in file
> isinf                               /var/tmp//cc0mv2QJ.o
> ld: fatal: Symbol referencing errors. No output written to isinf

A real answer:

Because C99's isinf() can not be implemented in the library.
C99 defines isinf() to be able to cope with ANY floating-point type.
And obviously C doesn't allow that in an actual function.
So this has to be implemented by a macro that
is specific to a particular implementation of the C99 compiler.
In Sun Studio, isinf() becomes a compiler builtin function called
__builtin_isinf() and the compiler takes care of that.

# uname -a
SunOS park2 5.10 Generic_118822-02 sun4u sparc SUNW,Sun-Blade-1000
# cat isinf.c
#include <math.h>

int func(double a)
{
return isinf(a);
}
# cc -V isinf.c -c -xO3 -S
cc: Sun C 5.7 2005/01/07
acomp: Sun C 5.7 2005/01/07
iropt: Sun Compiler Common 10 2005/01/07
cg: Sun Compiler Common 10 2005/01/07
# cat isinf.s
...
.global func
func:
/* 000000          5 */         sethi   %hi(0x80000000),%o5
/* 0x0004            */         sethi   %hi(0x7ff00000),%o4
/* 0x0008            */         andn    %o0,%o5,%o3
/* 0x000c          4 */         add     %sp,-104,%sp
/* 0x0010          5 */         xor     %o3,%o4,%o2
/* 0x0014            */         st      %o1,[%sp+92]
/* 0x0018            */         srl     %o2,0,%g5
/* 0x001c            */         st      %o0,[%sp+96]
/* 0x0020            */         srl     %o1,0,%o1
/* 0x0024            */         sub     %g0,%g5,%g4
/* 0x0028            */         sub     %g0,%o1,%g1
/* 0x002c            */         srlx    %g4,63,%g3
/* 0x0030            */         srlx    %g1,63,%o5
/* 0x0034            */         xor     %g3,1,%g2
/* 0x0038            */         xor     %o5,1,%o0
/* 0x003c            */         and     %g2,%o0,%o0
/* 0x0040            */         retl    ! Result =  %o0
/* 0x0044            */         add     %sp,104,%sp
/* 0x0048          0 */         .type   func,2
/* 0x0048          0 */         .size   func,(.-func)
...


As you see from above, there's no call.



A background on what's going on above:

isinf() macro is defined within the #if of:

#if defined(_STDC_C99) || _XOPEN_SOURCE - 0 >= 600 || defined(__C99FEATURES_
_)

and gcc 3.x obviously doesn't seem to define any of those macros
(and it shouldn't unless it can cope with all those macros
under that condition).

As Casper pointed out, there's a new math.h coming
that would work with gcc.

> and for Thomas :
>
> % gcc -Wall isinf.c -o isinf -lm -lsunmath
> isinf.c: In function `main':
> isinf.c:7: warning: implicit declaration of function `isinf'
> ld: fatal: library -lsunmath: not found
> ld: fatal: File processing errors. No output written to isinf
> collect2: ld returned 1 exit status
> zsh: exit 1     gcc -Wall isinf.c -o isinf -lm -lsunmath

libsunmath.a is included in the Sun compiler.
However, isinf() in libsunmath is different than C99's isinf().
It's "int isinf(double)" and is a real library routine.
--
#pragma ident "Seongbae Park, compiler, http://blogs.sun.com/seongbae/"





[ Post a follow-up to this message ]



    Sponsored Links  




 





   All times are GMT. The time now is 04:17 PM.      Post New Thread    Post A Reply      
  Last Thread   Next Thread Next


Most Popular forums 

Forum Jump:
Rate This Thread:

Forum Rules:
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is OFF
vB code is ON
Smilies are ON
[IMG] code is OFF
 

Back To The Top
Home | Usercp | Faq | Register