mirror of
https://github.com/Open-Argon/argon-v3.git
synced 2025-12-06 00:46:07 +00:00
fix trig inaccurate when given a large input
This commit is contained in:
31
src/trig.go
31
src/trig.go
@@ -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 {
|
||||||
|
|||||||
@@ -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
1
wasm-build
Executable file
@@ -0,0 +1 @@
|
|||||||
|
GOOS=js GOARCH=wasm go build -trimpath -ldflags="-s -w" -o ./bin/argon.wasm ./src
|
||||||
Reference in New Issue
Block a user