diff --git a/spec/real.spec.ts b/spec/real.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..ab26118764a183e0f160c09247e8677c292a472f --- /dev/null +++ b/spec/real.spec.ts @@ -0,0 +1,39 @@ +import { floatDivAndMod, isEqual } from "../src/base"; + +/** + * Tests d'égalité, de divisions entières et de modulo, à la tolérance près + */ + +const divAndModCases = [ + { D: 3, d: 0.2, q: 15, r: 0 }, + { D: 3, d: 0.1, q: 30, r: 0 }, + { D: 3, d: 0.3, q: 10, r: 0 }, + { D: 3, d: 3, q: 1, r: 0 }, + { D: 3, d: 3.00000000001, q: 1, r: 0 } +]; + +for (const c of divAndModCases) { + describe("real numbers division and modulo - ", () => { + it(`(${c.D} / ${c.d}) should be ${c.q}, (${c.D} % ${c.d}) should be ${c.r}`, () => { + const divAndMod = floatDivAndMod(c.D, c.d); + expect(divAndMod.q).toBe(c.q); + expect(divAndMod.r).toBe(c.r); + }); + }); +} + +const eqCases = [ + { a: 0, b: 0, eq: true }, + { a: 0, b: 0.0000000000001, eq: true }, + { a: 0.0000000000001, b: 0, eq: true }, + { a: 0.0000000000001, b: 0.0000000000001, eq: true }, + { a: 0, b: 0.1, eq: false } +]; + +for (const c of eqCases) { + describe("real numbers equality - ", () => { + it(c.a + " should " + (c.eq ? "" : "not ") + " be equal to " + c.b, () => { + expect(isEqual(c.a, c.b)).toBe(c.eq); + }); + }); +} diff --git a/src/base.ts b/src/base.ts index 40c5415647a3a98cdc9cbbffa8443d4ad30d57ab..9b0c9494aa93512cf67456824b205ea8f23498ec 100644 --- a/src/base.ts +++ b/src/base.ts @@ -96,5 +96,9 @@ export function floatDivAndMod(a: number, b: number, e: number = 1E-7): { q: num q++; } } + // si le modulo est nul à un pouïème, il est nul + if (isEqual(r, 0)) { + r = 0; + } return { q, r }; }