From 5cc9824a62e44d1da31afad0b4e3b1ac8d9c8931 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Wed, 2 Aug 2023 19:22:45 +0800 Subject: [PATCH] :sparkles: add new functions in bits & math lib --- std/bits.nas | 83 ++++++++++++++++++++++++++++++++++++++++++------- std/math.nas | 44 +++++++++++++++++++++++--- test/donuts.nas | 4 +-- 3 files changed, 113 insertions(+), 18 deletions(-) diff --git a/std/bits.nas b/std/bits.nas index caa2121..597fdc8 100644 --- a/std/bits.nas +++ b/std/bits.nas @@ -29,27 +29,27 @@ var u32_not = func(a) { } # get bit data from a special string. for example: -# bits.fld(s,0,3); -# if s stores 10100010(162) -# will get 101(5). +# bits.fld(s,0,3); +# if s stores 10100010(162) +# will get 101(5). var fld = func(str, startbit, len) { return __fld; } # get sign-extended data from a special string. for example: -# bits.sfld(s,0,3); -# if s stores 10100010(162) -# will get 101(5) then this will be signed extended to -# 11111101(-3). +# bits.sfld(s,0,3); +# if s stores 10100010(162) +# will get 101(5) then this will be signed extended to +# 11111101(-3). var sfld = func(str, startbit, len) { return __sfld; } # set value into a special string to store it. little-endian, for example: -# bits.setfld(s,0,8,69); -# set 01000101(69) to string will get this: -# 10100010(162) -# so s[0]=162. +# bits.setfld(s,0,8,69); +# set 01000101(69) to string will get this: +# 10100010(162) +# so s[0]=162. var setfld = func(str, startbit, len, val) { return __setfld; } @@ -57,4 +57,65 @@ var setfld = func(str, startbit, len, val) { # get a special string filled by '\0' to use in setfld. var buf = func(len) { return __buf; +} + +var bit = [var __ = 1]; +for(var i = 1; i<32; i += 1) { + func(vec, arg...){ + return __append; + }(bit, __ += __); +} + +var test = func(n, b) { + n /= bit[b]; + return int(n) != int(n/2)*2; +} + +# returns number with bit set +var set = func(n, b) { + return n+!test(n, b)*bit[b]; +} + + +# returns number with bit cleared +var clear = func(n, b) { + return n-test(n, b)*bit[b]; +} + + +# returns number with bit toggled +var toggle = func(n, b) { + return test(n, b) ? (n-bit[b]):(n+bit[b]); +} + + +# returns number with bit set to value +var switch = func(n, b, v) { + return n-(test(n, b)-!!v)*bit[b]; +} + + +# returns number as bit string, zero-padded to digits: +# bits.string(6) -> "110" +# bits.string(6, 8) -> "00000110" +var string = func(n, len = 1) { + var s = ""; + while (n) { + var v = int(n/2); + s = (v+v!=n)~s; + n = v; + } + for (var i = size(s); i as number: bits.value("110") -> 6 +var value = func(s) { + var n = 0; + var len = size(s); + for (var i = 0; i0? x:-x; } +var sgn = func(x) { + return x<0? -1:(x>0); +} + # floor will get the integral number of input argument # which is less than or equal to this argument. # this is basic native function in old nasal, @@ -57,6 +61,9 @@ var ln = func(x) { return __ln(x); } +var _iln10 = 1/ln(10); +var log10 = lg; + var sqrt = func(x) { return __sqrt(x); } @@ -69,10 +76,39 @@ var isnan = func(x) { return __isnan(x); } -var max = func(x, y) { - return x>y? x:y; +var max = func(x, arg...) { + var res = x; + foreach(var i;arg) { + if (i>res) { + res = i; + } + } + return res; } -var min = func(x, y) { - return xmax)? max:value); +} + +var approx_eq = func(a, b, d = 0.000001) { + return abs(a-b)