aboutsummaryrefslogtreecommitdiff
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
parent0730a56d38241d70f49cc6fe650c4995fe7dcb2c (diff)
downloadlua-181a837cac39fe9a411b64d67239d98785518c33.tar.gz
lua-181a837cac39fe9a411b64d67239d98785518c33.tar.bz2
lua-181a837cac39fe9a411b64d67239d98785518c33.zip
small improvement in the support of 'float' as lua_Number
-rw-r--r--llimits.h4
-rw-r--r--lmathlib.c72
-rw-r--r--lobject.c6
-rw-r--r--luaconf.h12
4 files changed, 48 insertions, 46 deletions
diff --git a/llimits.h b/llimits.h
index a316a0a0..c1711452 100644
--- a/llimits.h
+++ b/llimits.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: llimits.h,v 1.100 2012/10/01 14:14:45 roberto Exp roberto $ 2** $Id: llimits.h,v 1.101 2012/10/02 17:32:44 roberto Exp roberto $
3** Limits, basic types, and some other `installation-dependent' definitions 3** Limits, basic types, and some other `installation-dependent' definitions
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -282,7 +282,7 @@ union luai_Cast { double l_d; LUA_INT32 l_p[2]; };
282#include <math.h> 282#include <math.h>
283 283
284#define luai_hashnum(i,n) { int e; \ 284#define luai_hashnum(i,n) { int e; \
285 n = frexp(n, &e) * (lua_Number)(INT_MAX - DBL_MAX_EXP); \ 285 n = l_tg(frexp)(n, &e) * (lua_Number)(INT_MAX - DBL_MAX_EXP); \
286 lua_number2int(i, n); i += e; } 286 lua_number2int(i, n); i += e; }
287 287
288#endif 288#endif
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");
diff --git a/lobject.c b/lobject.c
index 11be7ad9..bdbd6cb5 100644
--- a/lobject.c
+++ b/lobject.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lobject.c,v 2.55 2011/11/30 19:30:16 roberto Exp roberto $ 2** $Id: lobject.c,v 2.56 2012/08/16 17:34:28 roberto Exp roberto $
3** Some generic functions over Lua objects 3** Some generic functions over Lua objects
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -104,7 +104,7 @@ static int isneg (const char **s) {
104 104
105static lua_Number readhexa (const char **s, lua_Number r, int *count) { 105static lua_Number readhexa (const char **s, lua_Number r, int *count) {
106 for (; lisxdigit(cast_uchar(**s)); (*s)++) { /* read integer part */ 106 for (; lisxdigit(cast_uchar(**s)); (*s)++) { /* read integer part */
107 r = (r * 16.0) + cast_num(luaO_hexavalue(cast_uchar(**s))); 107 r = (r * cast_num(16.0)) + cast_num(luaO_hexavalue(cast_uchar(**s)));
108 (*count)++; 108 (*count)++;
109 } 109 }
110 return r; 110 return r;
@@ -149,7 +149,7 @@ static lua_Number lua_strx2number (const char *s, char **endptr) {
149 *endptr = cast(char *, s); /* valid up to here */ 149 *endptr = cast(char *, s); /* valid up to here */
150 ret: 150 ret:
151 if (neg) r = -r; 151 if (neg) r = -r;
152 return ldexp(r, e); 152 return l_tg(ldexp)(r, e);
153} 153}
154 154
155#endif 155#endif
diff --git a/luaconf.h b/luaconf.h
index d6f58ab2..ebe038ce 100644
--- a/luaconf.h
+++ b/luaconf.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: luaconf.h,v 1.173 2012/07/13 14:54:14 roberto Exp roberto $ 2** $Id: luaconf.h,v 1.174 2012/10/01 14:14:45 roberto Exp roberto $
3** Configuration file for Lua 3** Configuration file for Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -406,6 +406,12 @@
406 406
407 407
408/* 408/*
409@@ l_mathop allows the addition of an 'l' or 'f' to all math operations
410*/
411#define l_mathop(x) (x)
412
413
414/*
409@@ lua_str2number converts a decimal numeric string to a number. 415@@ lua_str2number converts a decimal numeric string to a number.
410@@ lua_strx2number converts an hexadecimal numeric string to a number. 416@@ lua_strx2number converts an hexadecimal numeric string to a number.
411** In C99, 'strtod' does both conversions. C89, however, has no function 417** In C99, 'strtod' does both conversions. C89, however, has no function
@@ -427,8 +433,8 @@
427/* the following operations need the math library */ 433/* the following operations need the math library */
428#if defined(lobject_c) || defined(lvm_c) 434#if defined(lobject_c) || defined(lvm_c)
429#include <math.h> 435#include <math.h>
430#define luai_nummod(L,a,b) ((a) - floor((a)/(b))*(b)) 436#define luai_nummod(L,a,b) ((a) - l_mathop(floor)((a)/(b))*(b))
431#define luai_numpow(L,a,b) (pow(a,b)) 437#define luai_numpow(L,a,b) (l_mathop(pow)(a,b))
432#endif 438#endif
433 439
434/* these are quite standard operations */ 440/* these are quite standard operations */