aboutsummaryrefslogtreecommitdiff
path: root/lmathlib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-01-29 14:00:40 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-01-29 14:00:40 -0200
commit181a837cac39fe9a411b64d67239d98785518c33 (patch)
treea152450c524d9aef4cde0f667fdb53677b64fb4f /lmathlib.c
parent0730a56d38241d70f49cc6fe650c4995fe7dcb2c (diff)
downloadlua-181a837cac39fe9a411b64d67239d98785518c33.tar.gz
lua-181a837cac39fe9a411b64d67239d98785518c33.tar.bz2
lua-181a837cac39fe9a411b64d67239d98785518c33.zip
small improvement in the support of 'float' as lua_Number
Diffstat (limited to 'lmathlib.c')
-rw-r--r--lmathlib.c72
1 files changed, 34 insertions, 38 deletions
diff --git a/lmathlib.c b/lmathlib.c
index bc8df46e..5d0bddaa 100644
--- a/lmathlib.c
+++ b/lmathlib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lmathlib.c,v 1.80 2011/07/05 12:49:35 roberto Exp roberto $ 2** $Id: lmathlib.c,v 1.81 2012/05/18 17:47:53 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*/
@@ -17,106 +17,101 @@
17#include "lualib.h" 17#include "lualib.h"
18 18
19 19
20/* macro 'l_tg' allows the addition of an 'l' or 'f' to all math operations */
21#if !defined(l_tg)
22#define l_tg(x) (x)
23#endif
24
25
26#undef PI 20#undef PI
27#define PI (l_tg(3.1415926535897932384626433832795)) 21#define PI ((lua_Number)(3.1415926535897932384626433832795))
28#define RADIANS_PER_DEGREE (PI/180.0) 22#define RADIANS_PER_DEGREE ((lua_Number)(PI/180.0))
29 23
30 24
31 25
32static int math_abs (lua_State *L) { 26static int math_abs (lua_State *L) {
33 lua_pushnumber(L, l_tg(fabs)(luaL_checknumber(L, 1))); 27 lua_pushnumber(L, l_mathop(fabs)(luaL_checknumber(L, 1)));
34 return 1; 28 return 1;
35} 29}
36 30
37static int math_sin (lua_State *L) { 31static int math_sin (lua_State *L) {
38 lua_pushnumber(L, l_tg(sin)(luaL_checknumber(L, 1))); 32 lua_pushnumber(L, l_mathop(sin)(luaL_checknumber(L, 1)));
39 return 1; 33 return 1;
40} 34}
41 35
42static int math_sinh (lua_State *L) { 36static int math_sinh (lua_State *L) {
43 lua_pushnumber(L, l_tg(sinh)(luaL_checknumber(L, 1))); 37 lua_pushnumber(L, l_mathop(sinh)(luaL_checknumber(L, 1)));
44 return 1; 38 return 1;
45} 39}
46 40
47static int math_cos (lua_State *L) { 41static int math_cos (lua_State *L) {
48 lua_pushnumber(L, l_tg(cos)(luaL_checknumber(L, 1))); 42 lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1)));
49 return 1; 43 return 1;
50} 44}
51 45
52static int math_cosh (lua_State *L) { 46static int math_cosh (lua_State *L) {
53 lua_pushnumber(L, l_tg(cosh)(luaL_checknumber(L, 1))); 47 lua_pushnumber(L, l_mathop(cosh)(luaL_checknumber(L, 1)));
54 return 1; 48 return 1;
55} 49}
56 50
57static int math_tan (lua_State *L) { 51static int math_tan (lua_State *L) {
58 lua_pushnumber(L, l_tg(tan)(luaL_checknumber(L, 1))); 52 lua_pushnumber(L, l_mathop(tan)(luaL_checknumber(L, 1)));
59 return 1; 53 return 1;
60} 54}
61 55
62static int math_tanh (lua_State *L) { 56static int math_tanh (lua_State *L) {
63 lua_pushnumber(L, l_tg(tanh)(luaL_checknumber(L, 1))); 57 lua_pushnumber(L, l_mathop(tanh)(luaL_checknumber(L, 1)));
64 return 1; 58 return 1;
65} 59}
66 60
67static int math_asin (lua_State *L) { 61static int math_asin (lua_State *L) {
68 lua_pushnumber(L, l_tg(asin)(luaL_checknumber(L, 1))); 62 lua_pushnumber(L, l_mathop(asin)(luaL_checknumber(L, 1)));
69 return 1; 63 return 1;
70} 64}
71 65
72static int math_acos (lua_State *L) { 66static int math_acos (lua_State *L) {
73 lua_pushnumber(L, l_tg(acos)(luaL_checknumber(L, 1))); 67 lua_pushnumber(L, l_mathop(acos)(luaL_checknumber(L, 1)));
74 return 1; 68 return 1;
75} 69}
76 70
77static int math_atan (lua_State *L) { 71static int math_atan (lua_State *L) {
78 lua_pushnumber(L, l_tg(atan)(luaL_checknumber(L, 1))); 72 lua_pushnumber(L, l_mathop(atan)(luaL_checknumber(L, 1)));
79 return 1; 73 return 1;
80} 74}
81 75
82static int math_atan2 (lua_State *L) { 76static int math_atan2 (lua_State *L) {
83 lua_pushnumber(L, l_tg(atan2)(luaL_checknumber(L, 1), 77 lua_pushnumber(L, l_mathop(atan2)(luaL_checknumber(L, 1),
84 luaL_checknumber(L, 2))); 78 luaL_checknumber(L, 2)));
85 return 1; 79 return 1;
86} 80}
87 81
88static int math_ceil (lua_State *L) { 82static int math_ceil (lua_State *L) {
89 lua_pushnumber(L, l_tg(ceil)(luaL_checknumber(L, 1))); 83 lua_pushnumber(L, l_mathop(ceil)(luaL_checknumber(L, 1)));
90 return 1; 84 return 1;
91} 85}
92 86
93static int math_floor (lua_State *L) { 87static int math_floor (lua_State *L) {
94 lua_pushnumber(L, l_tg(floor)(luaL_checknumber(L, 1))); 88 lua_pushnumber(L, l_mathop(floor)(luaL_checknumber(L, 1)));
95 return 1; 89 return 1;
96} 90}
97 91
98static int math_fmod (lua_State *L) { 92static int math_fmod (lua_State *L) {
99 lua_pushnumber(L, l_tg(fmod)(luaL_checknumber(L, 1), 93 lua_pushnumber(L, l_mathop(fmod)(luaL_checknumber(L, 1),
100 luaL_checknumber(L, 2))); 94 luaL_checknumber(L, 2)));
101 return 1; 95 return 1;
102} 96}
103 97
104static int math_modf (lua_State *L) { 98static int math_modf (lua_State *L) {
105 lua_Number ip; 99 lua_Number ip;
106 lua_Number fp = l_tg(modf)(luaL_checknumber(L, 1), &ip); 100 lua_Number fp = l_mathop(modf)(luaL_checknumber(L, 1), &ip);
107 lua_pushnumber(L, ip); 101 lua_pushnumber(L, ip);
108 lua_pushnumber(L, fp); 102 lua_pushnumber(L, fp);
109 return 2; 103 return 2;
110} 104}
111 105
112static int math_sqrt (lua_State *L) { 106static int math_sqrt (lua_State *L) {
113 lua_pushnumber(L, l_tg(sqrt)(luaL_checknumber(L, 1))); 107 lua_pushnumber(L, l_mathop(sqrt)(luaL_checknumber(L, 1)));
114 return 1; 108 return 1;
115} 109}
116 110
117static int math_pow (lua_State *L) { 111static int math_pow (lua_State *L) {
118 lua_pushnumber(L, l_tg(pow)(luaL_checknumber(L, 1), 112 lua_Number x = luaL_checknumber(L, 1);
119 luaL_checknumber(L, 2))); 113 lua_Number y = luaL_checknumber(L, 2);
114 lua_pushnumber(L, l_mathop(pow)(x, y));
120 return 1; 115 return 1;
121} 116}
122 117
@@ -124,11 +119,11 @@ static int math_log (lua_State *L) {
124 lua_Number x = luaL_checknumber(L, 1); 119 lua_Number x = luaL_checknumber(L, 1);
125 lua_Number res; 120 lua_Number res;
126 if (lua_isnoneornil(L, 2)) 121 if (lua_isnoneornil(L, 2))
127 res = l_tg(log)(x); 122 res = l_mathop(log)(x);
128 else { 123 else {
129 lua_Number base = luaL_checknumber(L, 2); 124 lua_Number base = luaL_checknumber(L, 2);
130 if (base == 10.0) res = l_tg(log10)(x); 125 if (base == (lua_Number)10.0) res = l_mathop(log10)(x);
131 else res = l_tg(log)(x)/l_tg(log)(base); 126 else res = l_mathop(log)(x)/l_mathop(log)(base);
132 } 127 }
133 lua_pushnumber(L, res); 128 lua_pushnumber(L, res);
134 return 1; 129 return 1;
@@ -136,13 +131,13 @@ static int math_log (lua_State *L) {
136 131
137#if defined(LUA_COMPAT_LOG10) 132#if defined(LUA_COMPAT_LOG10)
138static int math_log10 (lua_State *L) { 133static int math_log10 (lua_State *L) {
139 lua_pushnumber(L, l_tg(log10)(luaL_checknumber(L, 1))); 134 lua_pushnumber(L, l_mathop(log10)(luaL_checknumber(L, 1)));
140 return 1; 135 return 1;
141} 136}
142#endif 137#endif
143 138
144static int math_exp (lua_State *L) { 139static int math_exp (lua_State *L) {
145 lua_pushnumber(L, l_tg(exp)(luaL_checknumber(L, 1))); 140 lua_pushnumber(L, l_mathop(exp)(luaL_checknumber(L, 1)));
146 return 1; 141 return 1;
147} 142}
148 143
@@ -158,14 +153,15 @@ static int math_rad (lua_State *L) {
158 153
159static int math_frexp (lua_State *L) { 154static int math_frexp (lua_State *L) {
160 int e; 155 int e;
161 lua_pushnumber(L, l_tg(frexp)(luaL_checknumber(L, 1), &e)); 156 lua_pushnumber(L, l_mathop(frexp)(luaL_checknumber(L, 1), &e));
162 lua_pushinteger(L, e); 157 lua_pushinteger(L, e);
163 return 2; 158 return 2;
164} 159}
165 160
166static int math_ldexp (lua_State *L) { 161static int math_ldexp (lua_State *L) {
167 lua_pushnumber(L, l_tg(ldexp)(luaL_checknumber(L, 1), 162 lua_Number x = luaL_checknumber(L, 1);
168 luaL_checkint(L, 2))); 163 lua_Number ep = luaL_checknumber(L, 2);
164 lua_pushnumber(L, l_mathop(ldexp)(x, ep));
169 return 1; 165 return 1;
170} 166}
171 167
@@ -210,15 +206,15 @@ static int math_random (lua_State *L) {
210 } 206 }
211 case 1: { /* only upper limit */ 207 case 1: { /* only upper limit */
212 lua_Number u = luaL_checknumber(L, 1); 208 lua_Number u = luaL_checknumber(L, 1);
213 luaL_argcheck(L, 1.0 <= u, 1, "interval is empty"); 209 luaL_argcheck(L, (lua_Number)1.0 <= u, 1, "interval is empty");
214 lua_pushnumber(L, l_tg(floor)(r*u) + 1.0); /* int in [1, u] */ 210 lua_pushnumber(L, l_mathop(floor)(r*u) + (lua_Number)(1.0)); /* [1, u] */
215 break; 211 break;
216 } 212 }
217 case 2: { /* lower and upper limits */ 213 case 2: { /* lower and upper limits */
218 lua_Number l = luaL_checknumber(L, 1); 214 lua_Number l = luaL_checknumber(L, 1);
219 lua_Number u = luaL_checknumber(L, 2); 215 lua_Number u = luaL_checknumber(L, 2);
220 luaL_argcheck(L, l <= u, 2, "interval is empty"); 216 luaL_argcheck(L, l <= u, 2, "interval is empty");
221 lua_pushnumber(L, l_tg(floor)(r*(u-l+1)) + l); /* int in [l, u] */ 217 lua_pushnumber(L, l_mathop(floor)(r*(u-l+1)) + l); /* [l, u] */
222 break; 218 break;
223 } 219 }
224 default: return luaL_error(L, "wrong number of arguments"); 220 default: return luaL_error(L, "wrong number of arguments");