shithub: scrax

ref: 86a1bffad7063d1f51dfe44c2126bbdf8b7fe5c8
dir: /nonsense/math.js/

View raw version
let count = 16
export let one = toNumber("1")
let pi180 = toNumber("57.29577951308232087679815481410517033240547246656432154916024386120284714832155263244096899585111094418622338163286489328144826460124831503606826786341194212252638809746726792630798870289311076793826144263826315820961046048702050644425965684112017191205773856628043128496262420337618793729762387079034031598071962408952204518620545992339631484190696622011512660969180151478763736692316410712677403851469016549959419251571198647943521066162438903520230675617779675711331568350620573131336015650134889801878870991777643918115931692001390297976826082932305533970261816604909295932820831549957980319559670071182520584664392317998584567191684399177541316529599530564062790449672487225343407247383306518587900882010719354855206048500684264734907560587438856753293217824660212423313273427212944530891667616714672023231374957844879817729067269084978013518866274395505591858069303343806736897172694639833885465199132675677482576493416923381113824332305320822419851645413959794725671400940417846961515605358215792046021354520190107416210293512926160978984400353223820447327628272090920918017114510890564653020820097912305909402354224041873558370874375538")

export function toNumber(n)
{
	let string = toString(n)
	if (string === "") return 0n
	let match = string.match(/^(-|\+?)([0-9]*)\.?([0-9]*)(?:e(-|\+?)([0-9]+))?$/)
	if (!match) return "NaN"
	let [_full, x, a, b, y = "", e = ""] = match
	if (a === "" && b === "") return "NaN"
	let c = count + e * (y + "1")
	if (c < 0) return 0n
	return (BigInt(a + b.padEnd(c, "0").slice(0, c)) + BigInt(b[c] >= "5")) * BigInt(x + "1")
}

export function toString(n)
{
	if (typeof n !== "bigint") return String(n)
	if (n < 0n) return "-" + toString(-n)
	let x = String(n).padStart(count + 1, "0")
	return (x.slice(0, -count) + "." + x.slice(-count).replace(/0+$/, "")).replace(/\.$/, "")
}

export function toFloat(n)
{
	return Number(toString(n))
}

function sign(n)
{
	if (n > 0n) return 1n
	if (n < 0n) return -1n
	return 0n
}

export function abs(n)
{
	return n * sign(n)
}

export function divide(n, q)
{
	return (n * one + q / 2n * sign(n)) / q
}

export function multiply(a, b)
{
	return divide(a * b, one ** 2n)
}

export function cos(n)
{
	n = abs(n) % (360n * one)
	if (n > 180n * one) n -= 360n * one
	let value = 1n
	let one1 = 1n
	let n2 = divide(n, pi180) ** 2n
	for (let i = 32n ; i > 0n ; i -= 2n) {
		one1 *= one ** 3n
		value = one1 - divide(n2 * value, i * (i - 1n))
	}
	return divide(value, one1)
}

export function sin(n)
{
	return cos(n - 90n * one)
}