diff options
Diffstat (limited to '')
-rw-r--r-- | bc_funcs/trig.bc | 98 | ||||
-rwxr-xr-x | cogs/utils.py | 12 |
2 files changed, 108 insertions, 2 deletions
diff --git a/bc_funcs/trig.bc b/bc_funcs/trig.bc new file mode 100644 index 0000000..01b7839 --- /dev/null +++ b/bc_funcs/trig.bc @@ -0,0 +1,98 @@ +define sin(x) { + auto b, s, r, a, q, i + + if (x < 0) + return (-sin(-x)) + + b = ibase + ibase = A + s = scale + scale = 1.1 * s + 2 + a = atan(1) + scale = 0 + q = (x / a + 2) / 4 + x -= 4 * q * a + + if (q % 2) + x = -x + + scale = s + 2 + r = a = x + q = -x * x + + for (i = 3; a; i += 2) { + a *= q / (i * (i - 1)) + r += a + } + + scale = s + ibase = b + return (r / 1) +} + +define cos(x){ + auto b, s + b = ibase + ibase = A + s = scale + scale *= 1.2 + x = sin(2 * atan(1) + x) + scale = s + ibase = b + + return (x / 1) +} + +define atan(x){ + auto b, s, r, n, a, m, t, f, i, u + b = ibase + ibase = A + n = 1 + + if (x < 0) { + n = -1 + x = -x + } + + if (scale < 65) { + if (x == 1) { + r = .7853981633974483096156608458198757210492923498437764552437361480/n + ibase = b + return (r) + } + + if (x == .2) { + r = .1973955598498807583700497651947902934475851037878521015176889402/n + ibase = b + return (r) + } + } + + s = scale + + if (x > .2) { + scale += 5 + a = atan(.2) + } + + scale = s + 3 + + while (x > .2) { + m++ + x = (x - .2) / (1 + .2 * x) + } + + r = u = x + f = -x * x + t = 1 + + for(i = 3; t; i += 2) { + u *= f + t = u / i + r += t + } + + scale = s + ibase = b + return ((m * a + r) / n) +}
\ No newline at end of file diff --git a/cogs/utils.py b/cogs/utils.py index ee40900..9f7ba66 100755 --- a/cogs/utils.py +++ b/cogs/utils.py @@ -439,9 +439,17 @@ class Utils(commands.Cog): await ctx.send(f"```List of custom commands:\n{output}```") @commands.command(aliases=["calc"]) - async def math(self, ctx, *, eqn): + async def math(self, ctx, *, eqn: str): + bc_funcs = r"/home/thomas/Steve-Bot/bc_funcs" + try: - result = subprocess.check_output(f"echo '{eqn}' | bc", shell=True) + # Allow for proper absolute value notation + pipes = eqn.count("|") + eqn = eqn.replace("|", "abs(", pipes // 2).replace("|", ")", pipes // 2) + + result = subprocess.check_output( + f"echo '{eqn}' | bc -f */{bc_funcs}", shell=True + ) await ctx.send(result.decode("utf-8").replace("\\\n", "").strip()) except subprocess.CalledProcessError as err: print(err) |