aboutsummaryrefslogtreecommitdiff
path: root/lmathlib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2010-11-11 13:39:12 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2010-11-11 13:39:12 -0200
commit1a46a713d227b77f3a6fe0ee727b6373bfea23e5 (patch)
tree4de4b0cb8a08ad30913eb3240b426142b9fb6d5d /lmathlib.c
parent23b9ceb0a481a2ae079f4605704d11946207d417 (diff)
downloadlua-1a46a713d227b77f3a6fe0ee727b6373bfea23e5.tar.gz
lua-1a46a713d227b77f3a6fe0ee727b6373bfea23e5.tar.bz2
lua-1a46a713d227b77f3a6fe0ee727b6373bfea23e5.zip
new macro 'l_tvar' to easy the use of mathlib with other floating
types (float and long double)
Diffstat (limited to 'lmathlib.c')
-rw-r--r--lmathlib.c67
1 files changed, 39 insertions, 28 deletions
diff --git a/lmathlib.c b/lmathlib.c
index 8b7d56dc..b8748f9f 100644
--- a/lmathlib.c
+++ b/lmathlib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lmathlib.c,v 1.75 2010/07/02 11:38:13 roberto Exp roberto $ 2** $Id: lmathlib.c,v 1.76 2010/10/25 20:31:11 roberto Exp roberto $
3** Standard mathematical library 3** Standard mathematical library
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -22,92 +22,102 @@
22#define RADIANS_PER_DEGREE (PI/180.0) 22#define RADIANS_PER_DEGREE (PI/180.0)
23 23
24 24
25/* macro 'l_tvar' allows the addition of an 'l' or 'f' to all
26 math operations */
27#if !defined(l_l_tvar)
28#define l_tvar(x) (x)
29#endif
30
31
25 32
26static int math_abs (lua_State *L) { 33static int math_abs (lua_State *L) {
27 lua_pushnumber(L, fabs(luaL_checknumber(L, 1))); 34 lua_pushnumber(L, l_tvar(fabs)(luaL_checknumber(L, 1)));
28 return 1; 35 return 1;
29} 36}
30 37
31static int math_sin (lua_State *L) { 38static int math_sin (lua_State *L) {
32 lua_pushnumber(L, sin(luaL_checknumber(L, 1))); 39 lua_pushnumber(L, l_tvar(sin)(luaL_checknumber(L, 1)));
33 return 1; 40 return 1;
34} 41}
35 42
36static int math_sinh (lua_State *L) { 43static int math_sinh (lua_State *L) {
37 lua_pushnumber(L, sinh(luaL_checknumber(L, 1))); 44 lua_pushnumber(L, l_tvar(sinh)(luaL_checknumber(L, 1)));
38 return 1; 45 return 1;
39} 46}
40 47
41static int math_cos (lua_State *L) { 48static int math_cos (lua_State *L) {
42 lua_pushnumber(L, cos(luaL_checknumber(L, 1))); 49 lua_pushnumber(L, l_tvar(cos)(luaL_checknumber(L, 1)));
43 return 1; 50 return 1;
44} 51}
45 52
46static int math_cosh (lua_State *L) { 53static int math_cosh (lua_State *L) {
47 lua_pushnumber(L, cosh(luaL_checknumber(L, 1))); 54 lua_pushnumber(L, l_tvar(cosh)(luaL_checknumber(L, 1)));
48 return 1; 55 return 1;
49} 56}
50 57
51static int math_tan (lua_State *L) { 58static int math_tan (lua_State *L) {
52 lua_pushnumber(L, tan(luaL_checknumber(L, 1))); 59 lua_pushnumber(L, l_tvar(tan)(luaL_checknumber(L, 1)));
53 return 1; 60 return 1;
54} 61}
55 62
56static int math_tanh (lua_State *L) { 63static int math_tanh (lua_State *L) {
57 lua_pushnumber(L, tanh(luaL_checknumber(L, 1))); 64 lua_pushnumber(L, l_tvar(tanh)(luaL_checknumber(L, 1)));
58 return 1; 65 return 1;
59} 66}
60 67
61static int math_asin (lua_State *L) { 68static int math_asin (lua_State *L) {
62 lua_pushnumber(L, asin(luaL_checknumber(L, 1))); 69 lua_pushnumber(L, l_tvar(asin)(luaL_checknumber(L, 1)));
63 return 1; 70 return 1;
64} 71}
65 72
66static int math_acos (lua_State *L) { 73static int math_acos (lua_State *L) {
67 lua_pushnumber(L, acos(luaL_checknumber(L, 1))); 74 lua_pushnumber(L, l_tvar(acos)(luaL_checknumber(L, 1)));
68 return 1; 75 return 1;
69} 76}
70 77
71static int math_atan (lua_State *L) { 78static int math_atan (lua_State *L) {
72 lua_pushnumber(L, atan(luaL_checknumber(L, 1))); 79 lua_pushnumber(L, l_tvar(atan)(luaL_checknumber(L, 1)));
73 return 1; 80 return 1;
74} 81}
75 82
76static int math_atan2 (lua_State *L) { 83static int math_atan2 (lua_State *L) {
77 lua_pushnumber(L, atan2(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); 84 lua_pushnumber(L, l_tvar(atan2)(luaL_checknumber(L, 1),
85 luaL_checknumber(L, 2)));
78 return 1; 86 return 1;
79} 87}
80 88
81static int math_ceil (lua_State *L) { 89static int math_ceil (lua_State *L) {
82 lua_pushnumber(L, ceil(luaL_checknumber(L, 1))); 90 lua_pushnumber(L, l_tvar(ceil)(luaL_checknumber(L, 1)));
83 return 1; 91 return 1;
84} 92}
85 93
86static int math_floor (lua_State *L) { 94static int math_floor (lua_State *L) {
87 lua_pushnumber(L, floor(luaL_checknumber(L, 1))); 95 lua_pushnumber(L, l_tvar(floor)(luaL_checknumber(L, 1)));
88 return 1; 96 return 1;
89} 97}
90 98
91static int math_fmod (lua_State *L) { 99static int math_fmod (lua_State *L) {
92 lua_pushnumber(L, fmod(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); 100 lua_pushnumber(L, l_tvar(fmod)(luaL_checknumber(L, 1),
101 luaL_checknumber(L, 2)));
93 return 1; 102 return 1;
94} 103}
95 104
96static int math_modf (lua_State *L) { 105static int math_modf (lua_State *L) {
97 double ip; 106 lua_Number ip;
98 double fp = modf(luaL_checknumber(L, 1), &ip); 107 lua_Number fp = l_tvar(modf)(luaL_checknumber(L, 1), &ip);
99 lua_pushnumber(L, ip); 108 lua_pushnumber(L, ip);
100 lua_pushnumber(L, fp); 109 lua_pushnumber(L, fp);
101 return 2; 110 return 2;
102} 111}
103 112
104static int math_sqrt (lua_State *L) { 113static int math_sqrt (lua_State *L) {
105 lua_pushnumber(L, sqrt(luaL_checknumber(L, 1))); 114 lua_pushnumber(L, l_tvar(sqrt)(luaL_checknumber(L, 1)));
106 return 1; 115 return 1;
107} 116}
108 117
109static int math_pow (lua_State *L) { 118static int math_pow (lua_State *L) {
110 lua_pushnumber(L, pow(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); 119 lua_pushnumber(L, l_tvar(pow)(luaL_checknumber(L, 1),
120 luaL_checknumber(L, 2)));
111 return 1; 121 return 1;
112} 122}
113 123
@@ -115,11 +125,11 @@ static int math_log (lua_State *L) {
115 lua_Number x = luaL_checknumber(L, 1); 125 lua_Number x = luaL_checknumber(L, 1);
116 lua_Number res; 126 lua_Number res;
117 if (lua_isnoneornil(L, 2)) 127 if (lua_isnoneornil(L, 2))
118 res = log(x); 128 res = l_tvar(log)(x);
119 else { 129 else {
120 lua_Number base = luaL_checknumber(L, 2); 130 lua_Number base = luaL_checknumber(L, 2);
121 if (base == 10.0) res = log10(x); 131 if (base == 10.0) res = l_tvar(log10)(x);
122 else res = log(x)/log(base); 132 else res = l_tvar(log)(x)/l_tvar(log)(base);
123 } 133 }
124 lua_pushnumber(L, res); 134 lua_pushnumber(L, res);
125 return 1; 135 return 1;
@@ -130,12 +140,12 @@ static int math_log10 (lua_State *L) {
130 luaL_error(L, "function " LUA_QL("log10") 140 luaL_error(L, "function " LUA_QL("log10")
131 " is deprecated; use log(x, 10) instead"); 141 " is deprecated; use log(x, 10) instead");
132#endif 142#endif
133 lua_pushnumber(L, log10(luaL_checknumber(L, 1))); 143 lua_pushnumber(L, l_tvar(log10)(luaL_checknumber(L, 1)));
134 return 1; 144 return 1;
135} 145}
136 146
137static int math_exp (lua_State *L) { 147static int math_exp (lua_State *L) {
138 lua_pushnumber(L, exp(luaL_checknumber(L, 1))); 148 lua_pushnumber(L, l_tvar(exp)(luaL_checknumber(L, 1)));
139 return 1; 149 return 1;
140} 150}
141 151
@@ -151,13 +161,14 @@ static int math_rad (lua_State *L) {
151 161
152static int math_frexp (lua_State *L) { 162static int math_frexp (lua_State *L) {
153 int e; 163 int e;
154 lua_pushnumber(L, frexp(luaL_checknumber(L, 1), &e)); 164 lua_pushnumber(L, l_tvar(frexp)(luaL_checknumber(L, 1), &e));
155 lua_pushinteger(L, e); 165 lua_pushinteger(L, e);
156 return 2; 166 return 2;
157} 167}
158 168
159static int math_ldexp (lua_State *L) { 169static int math_ldexp (lua_State *L) {
160 lua_pushnumber(L, ldexp(luaL_checknumber(L, 1), luaL_checkint(L, 2))); 170 lua_pushnumber(L, l_tvar(ldexp)(luaL_checknumber(L, 1),
171 luaL_checkint(L, 2)));
161 return 1; 172 return 1;
162} 173}
163 174
@@ -203,14 +214,14 @@ static int math_random (lua_State *L) {
203 case 1: { /* only upper limit */ 214 case 1: { /* only upper limit */
204 lua_Number u = luaL_checknumber(L, 1); 215 lua_Number u = luaL_checknumber(L, 1);
205 luaL_argcheck(L, 1.0 <= u, 1, "interval is empty"); 216 luaL_argcheck(L, 1.0 <= u, 1, "interval is empty");
206 lua_pushnumber(L, floor(r*u) + 1.0); /* int between 1 and `u' */ 217 lua_pushnumber(L, l_tvar(floor)(r*u) + 1.0); /* int in [1, u] */
207 break; 218 break;
208 } 219 }
209 case 2: { /* lower and upper limits */ 220 case 2: { /* lower and upper limits */
210 lua_Number l = luaL_checknumber(L, 1); 221 lua_Number l = luaL_checknumber(L, 1);
211 lua_Number u = luaL_checknumber(L, 2); 222 lua_Number u = luaL_checknumber(L, 2);
212 luaL_argcheck(L, l <= u, 2, "interval is empty"); 223 luaL_argcheck(L, l <= u, 2, "interval is empty");
213 lua_pushnumber(L, floor(r*(u-l+1)) + l); /* int between `l' and `u' */ 224 lua_pushnumber(L, l_tvar(floor)(r*(u-l+1)) + l); /* int in [l, u] */
214 break; 225 break;
215 } 226 }
216 default: return luaL_error(L, "wrong number of arguments"); 227 default: return luaL_error(L, "wrong number of arguments");