fix trig inaccurate when given a large input

This commit is contained in:
2024-03-14 12:51:50 +00:00
parent 23a9a443d6
commit 269430b025
3 changed files with 34 additions and 16 deletions

View File

@@ -7,6 +7,18 @@ import (
var PIFloatInaccuracy number = newNumber() var PIFloatInaccuracy number = newNumber()
type sinCacheValue struct {
INPUT number
OUTPUT number
}
var sinCache = []sinCacheValue{
{newNumber(), newNumber()},
{newNumber().Quo(PI, newNumber().SetInt64(2)), newNumber().SetInt64(1)},
{PI, newNumber()},
{newNumber().Add(PI, newNumber().Quo(PI, newNumber().SetInt64(2))), newNumber().SetInt64(-1)},
}
func init() { func init() {
PIFloatInaccuracy.SetFloat64(math.Asin(1) * 2) PIFloatInaccuracy.SetFloat64(math.Asin(1) * 2)
} }
@@ -25,6 +37,18 @@ var ArSin = builtinFunc{"sin", func(args ...any) (any, ArErr) {
} }
} }
num := newNumber().Set(args[0].(number)) num := newNumber().Set(args[0].(number))
toTrim := newNumber().Mul(PI, newNumber().SetInt64(2))
toTrim.Quo(num, toTrim)
toTrim = floor(toTrim)
toTrim.Mul(toTrim, newNumber().Mul(PI, newNumber().SetInt64(2)))
num.Sub(num, toTrim)
for i := 0; i < len(sinCache); i++ {
if sinCache[i].INPUT.Cmp(num) == 0 {
return sinCache[i].OUTPUT, ArErr{}
}
}
num.Quo(num, PI) num.Quo(num, PI)
num.Mul(num, PIFloatInaccuracy) num.Mul(num, PIFloatInaccuracy)
n, _ := num.Float64() n, _ := num.Float64()
@@ -71,12 +95,7 @@ var ArCos = builtinFunc{"cos", func(args ...any) (any, ArErr) {
EXISTS: true, EXISTS: true,
} }
} }
num := newNumber().Set(args[0].(number)) return builtinCall(ArSin, []any{newNumber().Add(args[0].(number), newNumber().Quo(PI, newNumber().SetInt64(2)))})
num.Quo(num, PI)
num.Mul(num, PIFloatInaccuracy)
n, _ := num.Float64()
outputnum := newNumber().SetFloat64(math.Cos(n))
return outputnum, ArErr{}
}} }}
var ArArccos = builtinFunc{"arccos", func(args ...any) (any, ArErr) { var ArArccos = builtinFunc{"arccos", func(args ...any) (any, ArErr) {
if len(args) != 1 { if len(args) != 1 {

View File

@@ -1,15 +1,13 @@
let x = do let x = do
let class = {} let class = {}
class.f(path) = do class.f(path) = do
let wowww = {} let nice(callback) = do
wowww.nice(callback) = callback() callback()
return wowww return class
let class = {nice:nice}
class.cool(path, callback) = do return class
let c = (class.f(path)) class.cool(path, callback) = class.f(path).nice(callback)
c.nice(callback) return class
return class.object()
forever do term.log(x.cool("to", ()=term.log("epic")).nice(()=term.log("test")))
x.cool("to", ()="epic")

1
wasm-build Executable file
View File

@@ -0,0 +1 @@
GOOS=js GOARCH=wasm go build -trimpath -ldflags="-s -w" -o ./bin/argon.wasm ./src