diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-01-29 14:00:40 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-01-29 14:00:40 -0200 |
commit | 181a837cac39fe9a411b64d67239d98785518c33 (patch) | |
tree | a152450c524d9aef4cde0f667fdb53677b64fb4f | |
parent | 0730a56d38241d70f49cc6fe650c4995fe7dcb2c (diff) | |
download | lua-181a837cac39fe9a411b64d67239d98785518c33.tar.gz lua-181a837cac39fe9a411b64d67239d98785518c33.tar.bz2 lua-181a837cac39fe9a411b64d67239d98785518c33.zip |
small improvement in the support of 'float' as lua_Number
-rw-r--r-- | llimits.h | 4 | ||||
-rw-r--r-- | lmathlib.c | 72 | ||||
-rw-r--r-- | lobject.c | 6 | ||||
-rw-r--r-- | luaconf.h | 12 |
4 files changed, 48 insertions, 46 deletions
@@ -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 |
@@ -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 | ||
32 | static int math_abs (lua_State *L) { | 26 | static 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 | ||
37 | static int math_sin (lua_State *L) { | 31 | static 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 | ||
42 | static int math_sinh (lua_State *L) { | 36 | static 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 | ||
47 | static int math_cos (lua_State *L) { | 41 | static 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 | ||
52 | static int math_cosh (lua_State *L) { | 46 | static 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 | ||
57 | static int math_tan (lua_State *L) { | 51 | static 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 | ||
62 | static int math_tanh (lua_State *L) { | 56 | static 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 | ||
67 | static int math_asin (lua_State *L) { | 61 | static 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 | ||
72 | static int math_acos (lua_State *L) { | 66 | static 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 | ||
77 | static int math_atan (lua_State *L) { | 71 | static 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 | ||
82 | static int math_atan2 (lua_State *L) { | 76 | static 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 | ||
88 | static int math_ceil (lua_State *L) { | 82 | static 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 | ||
93 | static int math_floor (lua_State *L) { | 87 | static 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 | ||
98 | static int math_fmod (lua_State *L) { | 92 | static 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 | ||
104 | static int math_modf (lua_State *L) { | 98 | static 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 | ||
112 | static int math_sqrt (lua_State *L) { | 106 | static 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 | ||
117 | static int math_pow (lua_State *L) { | 111 | static 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) |
138 | static int math_log10 (lua_State *L) { | 133 | static 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 | ||
144 | static int math_exp (lua_State *L) { | 139 | static 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 | ||
159 | static int math_frexp (lua_State *L) { | 154 | static 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 | ||
166 | static int math_ldexp (lua_State *L) { | 161 | static 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"); |
@@ -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 | ||
105 | static lua_Number readhexa (const char **s, lua_Number r, int *count) { | 105 | static 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 |
@@ -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 */ |