created_at2023-06-07 13:03:08.53367
updated_at2024-04-14 15:10:41.701576
descriptiona complex numbers, 2d/3d graphing, arbitrary precision, vector/matrix, cli calculator with real-time output and support for units



# kalc [![crates.io](https://img.shields.io/crates/v/kalc.svg)](https://crates.io/crates/kalc) [![AUR](https://img.shields.io/aur/version/kalc.svg)](https://aur.archlinux.org/packages/kalc/) ![image](https://github.com/bgkillas/kalc/assets/55570525/5ef1fa92-ca42-480b-a2a5-71cc1e254c1e) history file is stored in [config_dir](https://docs.rs/dirs/latest/dirs/fn.config_dir.html)/kalc/kalc.history config file is stored in [config_dir](https://docs.rs/dirs/latest/dirs/fn.config_dir.html)/kalc/kalc.config example in repo you can set permanent variables and functions in the file [config_dir](https://docs.rs/dirs/latest/dirs/fn.config_dir.html)/kalc/kalc.vars example in repo, also contains more advanced example usage, suggested not to use entire kalc.vars example on lower end systems as it may cause lag config defaults listed in kalc.config # install instructions ### linux use aur or run ```cargo install kalc``` ### windows download kalc.exe from https://github.com/bgkillas/kalc/releases/latest needs a modern terminal like 'windows terminal' or alacritty, alacritty has better latency seemingly for graphing install gnuplot via winget or [sourceforge](https://sourceforge.net/projects/gnuplot/files/gnuplot/) kalc.exe may have to be next to gnuplot.exe for graphing, gnuplot.exe is located in ```C:\Program Files\gnuplot\bin\``` ### macos install developer tools via ```xcode-select --install``` ```cargo install kalc``` install gnuplot via ```brew install gnuplot``` may need to run kalc from ```kalc 2> /dev/null``` for gnuplot not to output error messages # build instructions ### linux dependencys are: rust>=1.73.0, diffutils, gcc, m4, make ``` git clone https://github.com/bgkillas/kalc cd kalc cargo build --release ./target/release/kalc ``` ### windows have cargo and the toolchain ```stable-x86_64-pc-windows-gnu``` installed as per [gmp-mpfr-sys](https://docs.rs/gmp-mpfr-sys/latest/gmp_mpfr_sys/index.html#building-on-windows) install MSYS2 using the [installer](https://www.msys2.org/) launch MSYS2 MinGW and run ``` pacman -Syu pacman-mirrors pacman -S git diffutils m4 make mingw-w64-x86_64-gcc git clone https://github.com/bgkillas/kalc cd kalc mkdir /mnt mount C: /mnt ``` if cargo is locally installed ``` /mnt/Users/$USER/.cargo/bin/cargo build --release ./target/release/kalc.exe ``` if cargo is globally installed ``` cargo build --release ./target/release/kalc.exe ``` then move kalc.exe wherever you want in /mnt (your C drive) ### macos as per [gmp-mpfr-sys](https://docs.rs/gmp-mpfr-sys/latest/gmp_mpfr_sys/index.html#building-on-macos) assure the path upto your build path contains no spaces install developer tools via ```xcode-select --install``` ``` git clone https://github.com/bgkillas/kalc cd kalc cargo build --release ./target/release/kalc ``` # usage ``` Usage: kalc [FLAGS] equation_1 equation_2 equation_3... FLAGS: --help (this message) --help {thing} to get more detail on a function/option/feature, --help help to list all "things" --interactive/-i allows interaction after finishing the equations given --units toggles units --notation=e/E/s/n defines what kind of notation you should use,(e) 3e2,(E) 3E2,(s) 3*10^2,(n) 300 --graph=normal/depth/flat/none changes how a function is graphed --label=[x],[y],[z] sets the labels for the graphs x/y/z axis --angle=deg/rad/grad sets your angletype --2d=[num] number of points to graph in 2D --3d=[x],[y] number of points to graph in 3D --xr=[min],[max] x range for graphing --yr=[min],[max] y range for graphing --zr=[min],[max] z range for graphing --range=[num] sets all ranges to [-num],[num] --vxr=[min],[max] x range for graphing, graph view override, useful for parametric --vyr=[min],[max] y range for graphing, graph view override, useful for parametric --vzr=[min],[max] z range for graphing, graph view override, useful for parametric --vrange=[num] sets all ranges to [-num],[num], graph view override, useful for parametric --point [char] point style for graphing --base=[input],[output] sets the numbers base from 2 to 36 --ticks=[num] sets amount of ticks, -2 will be auto, -1 will be at every whole number, 0 will be none --onaxis toggles showing the ticks on the x/y/z axis on by default for 2d, off by default for 3d --prompt toggles the prompt --color toggles color output, toggled by default when running from arguments --comma toggles comma seperation --graph toggles graphing --vars disables default variables and kalc.vars --default sets to default settings and ignores kalc.vars --line toggles line graphing --rt toggles real time printing --polar toggles displaying polar vectors --frac toggles fraction display --prec=[num] sets the output precision(default 512) --graphprec=[num] sets the graph precision(default 64) --deci=[num] sets how many decimals to display, -1 for length of terminal, -2 for maximum decimal places, may need to up precision for more decimals --multi toggles multi line display for matrixes --tabbed toggles tabbed display for matrixes --surface displays a colored surface(based on z value) for 3d graphing, only supports 1 graph --scalegraph scales the y part of a 2d graph to the users screen size, setting --windowsize=x,y makes the ratio more accurate --saveto=[file] saves the graph as a png to the given file, --windowsize=x,y for resolution --siunits toggles keeping stuff in si units, a newton will show as 'm s^-2 kg' instead of 'N' - flags can be executed in runtime just without the dashes - "colors=" to see color settings - "exit" to exit the program - "clear" to clear the screen - "history [arg]" to see the history, arg searches for the arg it if specified - "vars" to list all variables - "option/var;function" to set a temporal option/var, example: "a=45;angle=deg;sin(a)" = sqrt(2)/2 - "f(x)=var:function" to set a temporal var when defining function, example: "f(x)=a=2:ax" = f(x)=2x - "_" to use the previous answer - "a={expr}" to define a variable - "f(x)=..." to define a function - "f(x,y,z...)=..." to define a multi variable function - "...=" display parsed input, show values of stuff like xr/deci/prec etc - "f...=null" to delete a function or variable - "{x,y,z...}" to define a cartesian vector - "[radius,theta,phi]" to define a polar vector (same as car{vec}) - "f(x)#g(x)" to graph multiple things - "{vec}#" to graph a vector - "{mat}#" to graph a matrix - "number#" to graph a complex number - "[f(x),x]" to graph a polar graph of f(x) - "{x,y}" to graph a parametric equation, example: {cos(x),sin(x)} unit circle, {f(x)cos(x),f(x)sin(x)} for polar graph - "{x,y,z}" to graph a parametric equation in 3d, example: {cos(x),sin(x),x} helix, {sin(x)cos(y),sin(x)sin(y),cos(x)} sphere - "{{a,b,c},{d,e,f},{g,h,i}}" to define a 3x3 matrix - "rnd" to generate a random number - "epoch" to get time in seconds since unix epoch - Alt+Enter will not graph whatever is present - "help {thing}" to get more detail on a function/option/feature - "help help" to list all things to query Order of Operations: - user defined functions - functions, !x, x!, x!!, |x| - % (modulus), .. (a..b creates lists of integers from a to b) - ^/** (exponentiation), // (a//b is a root b) ^^ (tetration) - × internal multiplication for units and negitive signs - * (multiplication), / (division) - + (addition), - (subtraction), +-/± (creates a list of the calculation if plus and the calculation if minus) - to/-> (unit conversions, ie 2m->yd=2.2, leaves unitless if perfect conversion) - < (lt), <= (le), > (gt), >= (ge), == (eq), != (!eq), >> (a>>b shifts b bits right), << (a<α, A=>Α, b=>β, B=>Β, c=>ξ, C=>Ξ, d=>Δ, D=>δ, e=>ε, E=>Ε, f=>φ, F=>Φ, g=>γ, G=>Γ, h=>η, H=>Η, i=>ι, I=>Ι, k=>κ, Κ=>Κ, l=>λ, L=>Λ, m=>μ, M=>Μ, n=>ν, Ν=>Ν, o=>ο, O=>Ο, p=>π, P=>Π, q=>θ, Q=>Θ, r=>ρ, R=>Ρ, s=>σ, S=>Σ, t=>τ, T=>Τ, u=>υ, U=>Υ, w=>ω, W=>Ω, y=>ψ, Y=>Ψ, x=>χ, X=>Χ, z=>ζ, Z=>Ζ, ==>±, `=>ⁱ, _=>∞, ;=>° numbers/minus sign convert to superscript acting as exponents ``` # basic example usage ``` kalc > 1+1 2 > f(x)=sin(2x) //define f(x), will display how it was parsed sin(2*x) > f(x) // graphs f(x) in 2D sin(2*x) > f(pi/2) // evaluates f(x) at x=pi/2, so sin(2pi/2)=sin(pi)=0 0 > f(x,y)=x^2+y^2 x^2+y^2 > f(1,2) // evaluates f(x,y) at x=1, y=2, so 1^2+2^2=5 5 > f(x,y) // graphs f(x,y) in 3D x^2+y^2 > a=3^3 3^3 > cbrt(a) 3 > im(exp(xi)) // graphs the imag part of exp(xi) in 2D, so sin(x) im(exp(x*1i)) > f(x,y,z,w)=x+y+z+w x+y+z+w > f(1,2,3,4) // evaluates f(x,y,z,w) at x=1, y=2, z=3, w=4, so 1+2+3+4=10 10 > f(x,y,2,5) // graphs f(x,y,2,5) in 3D with z=2 and w=5 so x+y+2+5 x+y+2+5 > f(2,5,x,y) // graphs f(2,5,x,y) in 3D with x=2 and y=5 so 2+5+x+y, to graph x and y have to be the unknown variables 2+5+x+y > |z| // graphs |(x+yi)| in 3D norm((x+y+1i)) > deg // enables degrees > pol({5,3,2}+{1,2,3}) // prints {magnitude, theta, phi} of {5,3,2}+{1,2,3} {9.273618495496,57.373262293469,39.805571092265} > piecewise({+-sqrt(2^2-x^2),(x<2)&&(x>-2)}) # 3{cos(x),sin(x)} # [5,x] # graph=flat;exp(ix) //graphing circles 4 different ways piecewise({0±sqrt(2^2-x^2),(x<2)&&(x>-2)}) 3*{cos(x),sin(x)} exp(1i*x) ``` ### cli usage ``` echo -ne 'sqrt(pi) \n pi^2'|kalc 1.7724538509055159 9.869604401089358 kalc 'sqrt(pi)' 'pi^2' 1.7724538509055159 9.869604401089358 echo -ne 'sin(x)#cos(x)'|kalc // graphs sin(x) and cos(x) in 2D kalc 'sin(x)#cos(x)' // graphs sin(x) and cos(x) in 2D ``` ### more advanced usage see kalc.vars in repo # graphing my gnuplot config in ~/.gnuplot ``` set terminal x11 set xyplane 0 ``` chars available for point style: ``` . - dot + - plus x - cross * - star s - empty square S - filled square o - empty circle O - filled circle t - empty triangle T - filled triangle d - empty del (upside down triangle) D - filled del (upside down triangle) r - empty rhombus R - filled rhombus ```
Commit count: 859

cargo fmt