POK
/home/jaouen/pok_official/pok/trunk/libpok/libm/pow.c
00001 /*
00002  *                               POK header
00003  * 
00004  * The following file is a part of the POK project. Any modification should
00005  * made according to the POK licence. You CANNOT use this file or a part of
00006  * this file is this part of a file for your own project
00007  *
00008  * For more information on the POK licence, please see our LICENCE FILE
00009  *
00010  * Please follow the coding guidelines described in doc/CODING_GUIDELINES
00011  *
00012  *                                      Copyright (c) 2007-2009 POK team 
00013  *
00014  * Created by julien on Fri Jan 30 14:41:34 2009 
00015  */
00016 
00017 
00018 
00019 /* @(#)w_pow.c 5.2 93/10/01 */
00020 /*
00021  * ====================================================
00022  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
00023  *
00024  * Developed at SunPro, a Sun Microsystems, Inc. business.
00025  * Permission to use, copy, modify, and distribute this
00026  * software is freely granted, provided that this notice
00027  * is preserved.
00028  * ====================================================
00029  */
00030 
00031 #ifdef POK_NEEDS_LIBMATH
00032 
00033 /*
00034  * wrapper pow(x,y) return x**y
00035  */
00036 
00037 #include <libm.h>
00038 #include "math_private.h"
00039 
00040 
00041 double
00042 pow(double x, double y) /* wrapper pow */
00043 {
00044 #ifdef _IEEE_LIBM
00045         return  __ieee754_pow(x,y);
00046 #else
00047         double z;
00048         z=__ieee754_pow(x,y);
00049         if(_LIB_VERSION == _IEEE_|| isnan(y)) return z;
00050         if(isnan(x)) {
00051             if(y==0.0)
00052                 return __kernel_standard(x,y,42); /* pow(NaN,0.0) */
00053             else
00054                 return z;
00055         }
00056         if(x==0.0){
00057             if(y==0.0)
00058                 return __kernel_standard(x,y,20); /* pow(0.0,0.0) */
00059             if(finite(y)&&y<0.0)
00060                 return __kernel_standard(x,y,23); /* pow(0.0,negative) */
00061             return z;
00062         }
00063         if(!finite(z)) {
00064             if(finite(x)&&finite(y)) {
00065                 if(isnan(z))
00066                     return __kernel_standard(x,y,24); /* pow neg**non-int */
00067                 else
00068                     return __kernel_standard(x,y,21); /* pow overflow */
00069             }
00070         }
00071         if(z==0.0&&finite(x)&&finite(y))
00072             return __kernel_standard(x,y,22); /* pow underflow */
00073         return z;
00074 #endif
00075 }
00076 
00077 #endif