create logarithm functions

This commit is contained in:
2023-03-11 12:22:33 +00:00
parent f5d8eb6d70
commit 42de489ca5
17 changed files with 235 additions and 89 deletions

86
src/logarithms.go Normal file
View File

@@ -0,0 +1,86 @@
package main
import (
"fmt"
"math"
)
var N = newNumber().SetInt64(1e10)
func Ln(x number) number {
output := newNumber()
output.SetInt64(1)
output.Quo(output, N)
n1, _ := x.Float64()
n2, _ := output.Float64()
output = newNumber().SetFloat64(math.Pow(n1, n2))
if output == nil {
output = infinity
}
output.Sub(output, newNumber().SetInt64(1))
output.Mul(output, N)
return output
}
func ArgonLn(a ...any) (any, ArErr) {
if len(a) != 0 {
return nil, ArErr{TYPE: "Runtime Error", message: "ln takes 1 argument, got " + fmt.Sprint(len(a)),
EXISTS: true}
}
if typeof(a[0]) != "number" {
return nil, ArErr{TYPE: "Runtime Error", message: "ln takes a number not a '" + typeof(a[0]) + "'",
EXISTS: true}
}
x := a[0].(number)
if x.Sign() <= 0 {
return nil, ArErr{TYPE: "Runtime Error", message: "ln takes a positive number",
EXISTS: true}
}
return Ln(x), ArErr{}
}
var __ln10 = Ln(newNumber().SetInt64(10))
func ArgonLog(a ...any) (any, ArErr) {
if len(a) != 1 {
return nil, ArErr{TYPE: "Runtime Error", message: "log takes 1 argument, got " + fmt.Sprint(len(a)),
EXISTS: true}
}
if typeof(a[0]) != "number" {
return nil, ArErr{TYPE: "Runtime Error", message: "log takes a number not a '" + typeof(a[0]) + "'",
EXISTS: true}
}
x := a[0].(number)
if x.Sign() <= 0 {
return nil, ArErr{TYPE: "Runtime Error", message: "log takes a positive number",
EXISTS: true}
}
return Ln(x).Quo(Ln(x), __ln10), ArErr{}
}
func ArgonLogN(a ...any) (any, ArErr) {
if len(a) != 2 {
return nil, ArErr{TYPE: "Runtime Error", message: "logN takes 2 argument, got " + fmt.Sprint(len(a)),
EXISTS: true}
}
if typeof(a[0]) != "number" {
return nil, ArErr{TYPE: "Runtime Error", message: "logN takes a number not a '" + typeof(a[0]) + "'",
EXISTS: true}
}
if typeof(a[1]) != "number" {
return nil, ArErr{TYPE: "Runtime Error", message: "logN takes a number not a '" + typeof(a[0]) + "'",
EXISTS: true}
}
N := a[0].(number)
if N.Sign() <= 0 {
return nil, ArErr{TYPE: "Runtime Error", message: "logN takes a positive number",
EXISTS: true}
}
x := a[1].(number)
if x.Sign() <= 0 {
return nil, ArErr{TYPE: "Runtime Error", message: "logN takes a positive number",
EXISTS: true}
}
return Ln(x).Quo(Ln(x), Ln(N)), ArErr{}
}