From 269430b025bb019a476f101f414cda7d70abe6d7 Mon Sep 17 00:00:00 2001 From: William Bell Date: Thu, 14 Mar 2024 12:51:50 +0000 Subject: [PATCH] fix trig inaccurate when given a large input --- src/trig.go | 31 +++++++++++++++++++++++++------ tests/broken_funcCall.ar | 18 ++++++++---------- wasm-build | 1 + 3 files changed, 34 insertions(+), 16 deletions(-) create mode 100755 wasm-build diff --git a/src/trig.go b/src/trig.go index 6c9029e..677523c 100644 --- a/src/trig.go +++ b/src/trig.go @@ -7,6 +7,18 @@ import ( 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() { 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)) + 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.Mul(num, PIFloatInaccuracy) n, _ := num.Float64() @@ -71,12 +95,7 @@ var ArCos = builtinFunc{"cos", func(args ...any) (any, ArErr) { EXISTS: true, } } - num := newNumber().Set(args[0].(number)) - num.Quo(num, PI) - num.Mul(num, PIFloatInaccuracy) - n, _ := num.Float64() - outputnum := newNumber().SetFloat64(math.Cos(n)) - return outputnum, ArErr{} + return builtinCall(ArSin, []any{newNumber().Add(args[0].(number), newNumber().Quo(PI, newNumber().SetInt64(2)))}) }} var ArArccos = builtinFunc{"arccos", func(args ...any) (any, ArErr) { if len(args) != 1 { diff --git a/tests/broken_funcCall.ar b/tests/broken_funcCall.ar index 73ce20e..d27ee7d 100644 --- a/tests/broken_funcCall.ar +++ b/tests/broken_funcCall.ar @@ -1,15 +1,13 @@ let x = do let class = {} class.f(path) = do - let wowww = {} - wowww.nice(callback) = callback() - return wowww - - class.cool(path, callback) = do - let c = (class.f(path)) - c.nice(callback) - return class.object() + let nice(callback) = do + callback() + return class + let class = {nice:nice} + return class + class.cool(path, callback) = class.f(path).nice(callback) + return class -forever do - x.cool("to", ()="epic") \ No newline at end of file +term.log(x.cool("to", ()=term.log("epic")).nice(()=term.log("test"))) \ No newline at end of file diff --git a/wasm-build b/wasm-build new file mode 100755 index 0000000..2be3d57 --- /dev/null +++ b/wasm-build @@ -0,0 +1 @@ +GOOS=js GOARCH=wasm go build -trimpath -ldflags="-s -w" -o ./bin/argon.wasm ./src \ No newline at end of file