decimal: expose decimal type to lua.
Add a decimal library to lua. Part of #692 @TarantoolBot document Title: Document decimal module in lua. First of all, you have to require the package via `decimal = require('decimal')` Now you can construct decimals via `new` method. Decimals may be constructed from lua numbers, strings, unsigned and signed 64 bit integers. Decimal is a fixed-point type with maximum 38 digits of precision. All the calculations are exact, so, be careful when constructing decimals from lua numbers: they may hold only 15 decimal digits of precision. You are advised to construct decimals from strings, since strings represent decimals exactly, and vice versa. ``` a = decimal.new(123e-7) b = decimal.new('123.456') c = decimal.new('123.456e2') d = decimal.new(123ULL) e = decimal.new(2) ``` The allowed operations are addition, subtraction, division, multiplication and power. If at least one of the operands is decimal, decimal operations are performed. The other operand may be either decimal or string, containing a number representation, or a lua number. Operations only fail on an overflow, i.e. when result exceeds 10^38 - 1. This includes division by zero. In these cases an error `Operation failed` is raised. Underflow is also possible, when precision needed to store the exact result exceeds 38 digits. Underflow is not an error. When an underflow happens, the result is rounded to 38 digits of precision. ``` a = decimal.new(123e-7) b = decimal.new('123.456') c = decimal.new('123.456e2') d = decimal.new(123ULL) e = decimal.new(2) ``` ``` tarantool> a + b --- - '123.456012300000000' ... tarantool> c - d --- - '12222.6' ... tarantool> c / b --- - '100' ... tarantool> d * d --- - '15129' ... tarantool> d ^ 2 --- - '15129' ... tarantool> 2 ^ d --- - '10633823966279326983230456482242756608'... tarantool> e ^ d --- - '10633823966279326983230456482242756608' ... ``` The following math functions are also supported: log10, ln, exp, sqrt. When specified as `decimal.opname()`, operations may be performed on strings and lua numbers. ``` f = decimal.new(100) tarantool> decimal.log10(f) --- - '2' ... tarantool> decimal.sqrt(f) --- - '10' ... tarantool> e2 = decimal.exp(2) --- ... tarantool> decimal.ln(e2) --- - '2.0000000000000000000000000000000000000' ... There are also `abs` and `tostring` methods, and an unary minus operator, which are pretty self-explanatory. ``` tarantool> a = decimal.new('-5') --- ... tarantool> a --- - '-5' ... tarantool> decimal.abs(a) --- - '5' ... tarantool> -a --- - '5' ... tostring(a) --- - '-5' ... ``` `decimal.precision`, `decimal.scale` and `decimal.round` : The first two methods return precision, i.e. decimal digits in number representation, and scale, i.e. decimal digits after the decimal point in the number representation. `decimal.round` rounds the number to the given scale. ``` tarantool> a = decimal.new('123.456789') --- ... tarantool> decimal.precision(a) --- - 9 ... tarantool> decimal.scale(a) --- - 6 ... tarantool> decimal.round(a, 4) --- - '123.4568' ... ``` Comparsions: `>`, `<`, `>=`, `<=`, `==` are also legal and work as expected. You may compare decimals with lua numbers or strings. In that case comparsion will happen after the values are converted to decimal type.
Showing
- src/CMakeLists.txt 1 addition, 0 deletionssrc/CMakeLists.txt
- src/lua/decimal.c 351 additions, 0 deletionssrc/lua/decimal.c
- src/lua/decimal.h 47 additions, 0 deletionssrc/lua/decimal.h
- src/lua/init.c 2 additions, 0 deletionssrc/lua/init.c
- test/app/decimal.result 460 additions, 0 deletionstest/app/decimal.result
- test/app/decimal.test.lua 130 additions, 0 deletionstest/app/decimal.test.lua
Loading
Please register or sign in to comment