Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion @coven/compare/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"$schema": "https://raw.githubusercontent.com/denoland/deno/main/cli/schemas/config-file.v1.json",
"exports": "./mod.ts",
"name": "@coven/compare",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @coven/constants/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"$schema": "https://raw.githubusercontent.com/denoland/deno/main/cli/schemas/config-file.v1.json",
"exports": "./mod.ts",
"name": "@coven/constants",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @coven/cron/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"$schema": "https://raw.githubusercontent.com/denoland/deno/main/cli/schemas/config-file.v1.json",
"exports": "./mod.ts",
"name": "@coven/cron",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @coven/expression/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"$schema": "https://raw.githubusercontent.com/denoland/deno/main/cli/schemas/config-file.v1.json",
"exports": "./mod.ts",
"name": "@coven/expression",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @coven/iterables/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
"./async": "./async/mod.ts"
},
"name": "@coven/iterables",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @coven/math/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"$schema": "https://raw.githubusercontent.com/denoland/deno/main/cli/schemas/config-file.v1.json",
"exports": "./mod.ts",
"name": "@coven/math",
"version": "0.9.5"
"version": "0.9.6"
}
39 changes: 25 additions & 14 deletions @coven/math/preciseDivide.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,14 @@ import type { PreciseFunction } from "./PreciseFunction.ts";

const alwaysInfinity = always(Infinity);

/**
* @internal We have to define a max so we avoid looping forever.
*/
const MAX_DECIMAL_PLACES = 256n;

/**
* Curried divide operation using the internal {@linkcode Precise} type.
* Precision for float values has a maximum of 256.
*
* @example
* ```typescript
Expand All @@ -25,22 +31,27 @@ export const preciseDivide: PreciseFunction<Precise | number> = memoFunction(
(divisorBase, divisorExponent) =>
divisorBase === 0n ? alwaysInfinity : (
memoFunction((dividendBase, dividendExponent) => {
let exponent = 0n;
let base = dividendBase / divisorBase;
if (dividendBase === 0n) {
return precise(0n, 0n);
} else {
let exponent = 0n;
let base = dividendBase / divisorBase;

for (
let dividend = dividendBase;
base * divisorBase !== dividend;
) {
exponent += 1n;
dividend = dividendBase * 10n ** exponent;
base = dividend / divisorBase;
}
for (
let dividend = dividendBase;
exponent < MAX_DECIMAL_PLACES
&& base * divisorBase !== dividend;
) {
exponent += 1n;
dividend = dividendBase * 10n ** exponent;
base = dividend / divisorBase;
}

return precise(
base,
dividendExponent - exponent - divisorExponent,
);
return precise(
base,
dividendExponent - exponent - divisorExponent,
);
}
})
),
);
4 changes: 4 additions & 0 deletions @coven/math/tests/calculate.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -166,3 +166,7 @@ Deno.test("2 / NaN = NaN", () =>
Deno.test("Infinity / NaN = NaN", () =>
assertStrictEquals(calculate(Infinity).dividedBy(NaN).total, NaN),
);

Deno.test("1 / 3 * 3 = 1", () =>
assertStrictEquals(calculate(1).dividedBy(3).times(3).total, 1),
);
40 changes: 40 additions & 0 deletions @coven/math/tests/preciseDivide.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,46 @@ Deno.test("1 / 0 = Infinity", () =>
assertStrictEquals(preciseDivide(0n, 0n)(1n, 0n), Infinity),
);

Deno.test("0 / 2 = 0", () =>
assertStrictEquals(preciseDivide(2n, 0n)(0n, 0n), precise(0n, 0n)),
);

Deno.test(
"1 / 3 = 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333",
() =>
assertStrictEquals(
preciseDivide(3n, 0n)(1n, 0n),
precise(
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333n,
-256n,
),
),
);

Deno.test(
"22 / 7 = 3.1428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428",
() =>
assertStrictEquals(
preciseDivide(7n, 0n)(22n, 0n),
precise(
31428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428n,
-256n,
),
),
);

Deno.test(
"103993 / 33102 = 3.1415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316",
() =>
assertStrictEquals(
preciseDivide(33102n, 0n)(103993n, 0n),
precise(
31415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316n,
-256n,
),
),
);

Deno.test("Same Precise returned with same values", () =>
assertStrictEquals(
preciseDivide(2n, 0n)(3n, 0n),
Expand Down
40 changes: 38 additions & 2 deletions @coven/math/tests/preciseToNumber.test.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { assertStrictEquals } from "@std/assert";
import { preciseToNumber } from "../preciseToNumber.ts";

Deno.test("precise(13n) = 13", () =>
Deno.test("precise(13n, 0n) = 13", () =>
assertStrictEquals(preciseToNumber(13n, 0n), 13),
);

Deno.test("precise(13n, 2n) = 1300", () =>
assertStrictEquals(preciseToNumber(13n, 2n), 1300),
);

Deno.test("precise(-13n) = -13", () =>
Deno.test("precise(-13n, 0n) = -13", () =>
assertStrictEquals(preciseToNumber(-13n, 0n), -13),
);

Expand All @@ -36,3 +36,39 @@ Deno.test("precise(-13_001n, -1n) = -1300.1", () =>
Deno.test("precise(-13_000n, 0n) = -13_000", () =>
assertStrictEquals(preciseToNumber(-13_000n, 0n), -13_000),
);

Deno.test(
"precise(3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333n, -256n) = 1 / 3",
() =>
assertStrictEquals(
preciseToNumber(
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333n,
-256n,
),
1 / 3,
),
);

Deno.test(
"precise(31428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428n, -256n) = 22 / 7",
() =>
assertStrictEquals(
preciseToNumber(
31428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428n,
-256n,
),
22 / 7,
),
);

Deno.test(
"precise(31415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316n, -256n) = 103993 / 33102",
() =>
assertStrictEquals(
preciseToNumber(
31415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316n,
-256n,
),
103993 / 33102,
),
);
2 changes: 1 addition & 1 deletion @coven/memo/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"$schema": "https://raw.githubusercontent.com/denoland/deno/main/cli/schemas/config-file.v1.json",
"exports": "./mod.ts",
"name": "@coven/memo",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @coven/pair/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@
"react-dom": "npm:react-dom@^19.2.5"
},
"name": "@coven/pair",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @coven/parsers/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"$schema": "https://raw.githubusercontent.com/denoland/deno/main/cli/schemas/config-file.v1.json",
"exports": "./mod.ts",
"name": "@coven/parsers",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @coven/predicates/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"$schema": "https://raw.githubusercontent.com/denoland/deno/main/cli/schemas/config-file.v1.json",
"exports": "./mod.ts",
"name": "@coven/predicates",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @coven/rules/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"$schema": "https://raw.githubusercontent.com/denoland/deno/main/cli/schemas/config-file.v1.json",
"exports": "./mod.ts",
"name": "@coven/rules",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @coven/template/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"$schema": "https://raw.githubusercontent.com/denoland/deno/main/cli/schemas/config-file.v1.json",
"exports": "./mod.ts",
"name": "@coven/template",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @coven/terminal/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"$schema": "https://raw.githubusercontent.com/denoland/deno/main/cli/schemas/config-file.v1.json",
"exports": "./mod.ts",
"name": "@coven/terminal",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @coven/types/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"$schema": "https://raw.githubusercontent.com/denoland/deno/main/cli/schemas/config-file.v1.json",
"exports": "./mod.ts",
"name": "@coven/types",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @coven/utils/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"$schema": "https://raw.githubusercontent.com/denoland/deno/main/cli/schemas/config-file.v1.json",
"exports": "./mod.ts",
"name": "@coven/utils",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @simulcast/core/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"$schema": "https://raw.githubusercontent.com/denoland/deno/main/cli/schemas/config-file.v1.json",
"exports": "./mod.ts",
"name": "@simulcast/core",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @simulcast/preact/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@
"preact": "npm:preact@^10.29.1"
},
"name": "@simulcast/preact",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @simulcast/react/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@
"react": "npm:react@^19.2.5"
},
"name": "@simulcast/react",
"version": "0.9.5"
"version": "0.9.6"
}
2 changes: 1 addition & 1 deletion @simulcast/vue/deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
"vue": "npm:vue@^3.5.32"
},
"name": "@simulcast/vue",
"version": "0.9.5"
"version": "0.9.6"
}