C:\JS_KRESREAL\HBP_konverzia\lua\lmathx.c C:\JS_LUA\lua-5.2.0\src\lmathx.c
/*  
* lmathx.c  
* C99 math functions for Lua  
* Luiz Henrique de Figueiredo <lhf@tecgraf.puc-rio.br>  
* 07 Aug 2009 15:25:21  
* This code is hereby placed in the public domain.  
*/   
   
#define _GNU_SOURCE 1  
#include <math.h>  
#include <stdio.h>  
   
#include "lua.h"  
#include "lualib.h"  
#include "lauxlib.h"  
   
#define A(i)    luaL_checknumber(L,i)  
   
static int Lacosh(lua_State *L)  
{  
 lua_pushnumber(L,acosh(A(1)));  
 return 1;  
}  
   
static int Lasinh(lua_State *L)  
{  
 lua_pushnumber(L,asinh(A(1)));  
 return 1;  
}  
   
static int Latanh(lua_State *L)  
{  
 lua_pushnumber(L,atanh(A(1)));  
 return 1;  
}  
   
static int Lcbrt(lua_State *L)  
{  
 lua_pushnumber(L,cbrt(A(1)));  
 return 1;  
}  
   
static int Lcopysign(lua_State *L)  
{  
 lua_pushnumber(L,copysign(A(1),A(2)));  
 return 1;  
}  
   
static int Lerf(lua_State *L)  
{  
 lua_pushnumber(L,erf(A(1)));  
 return 1;  
}  
   
static int Lerfc(lua_State *L)  
{  
 lua_pushnumber(L,erfc(A(1)));  
 return 1;  
}  
   
static int Lexp2(lua_State *L)  
{  
 lua_pushnumber(L,exp2(A(1)));  
 return 1;  
}  
   
static int Lexpm1(lua_State *L)  
{  
 lua_pushnumber(L,expm1(A(1)));  
 return 1;  
}  
   
static int Lfdim(lua_State *L)  
{  
 lua_pushnumber(L,fdim(A(1),A(2)));  
 return 1;  
}  
   
static int Lfma(lua_State *L)  
{  
 lua_pushnumber(L,fma(A(1),A(2),A(3)));  
 return 1;  
}  
   
static int Lfmax(lua_State *L)  
{  
int i,n=lua_gettop(L);  
lua_Number m=A(1);  
for (i=2; i<=n; i++) m=fmax(m,A(i));  
lua_pushnumber(L,m);  
return 1;  
}  
   
static int Lfmin(lua_State *L)  
{  
int i,n=lua_gettop(L);  
lua_Number m=A(1);  
for (i=2; i<=n; i++) m=fmin(m,A(i));  
lua_pushnumber(L,m);  
return 1;  
}  
   
static int Lfpclassify(lua_State *L)  
{  
switch (fpclassify(A(1)))  
{  
 case FP_INFINITE:    lua_pushliteral(L,"inf");    break;  
 case FP_NAN:        lua_pushliteral(L,"nan");    break;  
 case FP_NORMAL:    lua_pushliteral(L,"normal");    break;  
 case FP_SUBNORMAL:    lua_pushliteral(L,"subnormal");    break;  
 case FP_ZERO:        lua_pushliteral(L,"zero");    break;  
}  
return 1;  
}  
   
static int Lhypot(lua_State *L)  
{  
 lua_pushnumber(L,hypot(A(1),A(2)));  
 return 1;  
}  
   
static int Lisfinite(lua_State *L)  
{  
 lua_pushboolean(L,isfinite(A(1)));  
 return 1;  
}  
   
static int Lisinf(lua_State *L)  
{  
 lua_pushboolean(L,isinf(A(1)));  
 return 1;  
}  
   
static int Lisnan(lua_State *L)  
{  
 lua_pushboolean(L,isnan(A(1)));  
 return 1;  
}  
   
static int Lisnormal(lua_State *L)  
{  
 lua_pushboolean(L,isnormal(A(1)));  
 return 1;  
}  
   
static int Llgamma(lua_State *L)  
{  
 lua_pushnumber(L,lgamma(A(1)));  
 return 1;  
}  
   
static int Llog1p(lua_State *L)  
{  
 lua_pushnumber(L,log1p(A(1)));  
 return 1;  
}  
   
static int Llog2(lua_State *L)  
{  
 lua_pushnumber(L,log2(A(1)));  
 return 1;  
}  
   
static int Llogb(lua_State *L)  
{  
 lua_pushnumber(L,logb(A(1)));  
 return 1;  
}  
   
static int Lnearbyint(lua_State *L)  
{  
 lua_pushnumber(L,nearbyint(A(1)));  
 return 1;  
}  
   
static int Lnextafter(lua_State *L)  
{  
 lua_pushnumber(L,nextafter(A(1),A(2)));  
 return 1;  
}  
   
static int Lremainder(lua_State *L)  
{  
 lua_pushnumber(L,remainder(A(1),A(2)));  
 return 1;  
}  
   
static int Lrint(lua_State *L)  
{  
 lua_pushnumber(L,rint(A(1)));  
 return 1;  
}  
   
static int Lround(lua_State *L)  
{  
 lua_pushnumber(L,round(A(1)));  
 return 1;  
}  
   
static int Lscalbn(lua_State *L)  
{  
 lua_pushnumber(L,scalbn(A(1),(int)A(2)));  
 return 1;  
}  
   
static int Lsignbit(lua_State *L)  
{  
 lua_pushboolean(L,signbit(A(1)));  
 return 1;  
}  
   
static int Ltgamma(lua_State *L)  
{  
 lua_pushnumber(L,tgamma(A(1)));  
 return 1;  
}  
   
static int Ltrunc(lua_State *L)  
{  
 lua_pushnumber(L,trunc(A(1)));  
 return 1;  
}  
   
static const struct luaL_Reg mathx[] =     //R[] =  
{  
   { "acosh",    Lacosh },  
   { "asinh",    Lasinh },  
   { "atanh",    Latanh },  
   { "cbrt",    Lcbrt },  
   { "copysign",    Lcopysign },  
   { "erfc",    Lerfc },  
   { "erf",    Lerf },  
   { "exp2",    Lexp2 },  
   { "expm1",    Lexpm1 },  
   { "fdim",    Lfdim },  
   { "fma",    Lfma },  
   { "fmax",    Lfmax },  
   { "fmin",    Lfmin },  
   { "fpclassify",    Lfpclassify },  
   { "gamma",    Ltgamma },  
   { "hypot",    Lhypot },  
   { "isfinite",    Lisfinite },  
   { "isinf",    Lisinf },  
   { "isnan",    Lisnan },  
   { "isnormal",    Lisnormal },  
   { "lgamma",    Llgamma },  
   { "log1p",    Llog1p },  
   { "log2",    Llog2 },  
   { "logb",    Llogb },  
   { "nearbyint",    Lnearbyint },  
   { "nextafter",    Lnextafter },  
   { "remainder",    Lremainder },  
   { "rint",    Lrint },  
   { "round",    Lround },  
   { "scalbn",    Lscalbn },  
   { "signbit",    Lsignbit },  
   { "trunc",    Ltrunc },  
   { NULL,        NULL }  
};  
   
//  lualib.h:  
//#define LUA_MATHXLIBNAME  "mathx"                 //jano 13:48 2011-10-30  
//LUALIB_API int (luaopen_mathx) (lua_State *L);            //jano 13:48 2011-10-30  
//  linit.c:  
// {LUA_MATHXLIBNAME, luaopen_mathx}, //jano 13:48 2011-10-30  
   
   
LUALIB_API int luaopen_mathx(lua_State *L)  
{  
 luaL_newlib(L, mathx);        // luaL_register(L,LUA_MATHLIBNAME,R);  
lua_pushnumber(L,INFINITY);  
lua_setfield(L,-2,"infinity");  
lua_pushnumber(L,NAN);  
lua_setfield(L,-2,"nan");  
return 1;  
}