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 */ |
