Q96.ts
This commit is contained in:
27
src/Q96.ts
Normal file
27
src/Q96.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
// Q64.96 helpers (JavaScript)
|
||||||
|
const Q96: bigint = 1n << 96n;
|
||||||
|
|
||||||
|
function toQ96(x: string | number): bigint { // x: string | number -> bigint
|
||||||
|
// Use Decimal for precise parsing if needed
|
||||||
|
const [intPart, fracPart = ""] = String(x).split(".");
|
||||||
|
const frac: string = (fracPart + "0".repeat(30)).slice(0, 30); // up to 30 decimals
|
||||||
|
const scaled: bigint = BigInt(intPart) * 10n ** 30n + BigInt(frac);
|
||||||
|
return (scaled * Q96) / (10n ** 30n);
|
||||||
|
}
|
||||||
|
|
||||||
|
function fromQ96(q: bigint): string { // q: bigint -> string
|
||||||
|
const scaled: bigint = q * (10n ** 30n) / Q96;
|
||||||
|
const intPart = scaled / (10n ** 30n);
|
||||||
|
let frac = (scaled % (10n ** 30n)).toString().padStart(30, "0");
|
||||||
|
// trim trailing zeros
|
||||||
|
frac = frac.replace(/0+$/, "");
|
||||||
|
return frac.length ? `${intPart.toString()}.${frac}` : intPart.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
function mulQ96(a: bigint, b: bigint) { // (bigint, bigint) -> bigint in Q96
|
||||||
|
return (a * b) / Q96;
|
||||||
|
}
|
||||||
|
|
||||||
|
function divQ96(a: bigint, b: bigint) { // (bigint, bigint) -> bigint in Q96
|
||||||
|
return (a * Q96) / b;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user