Resources Numerical accuracy

Equality comparisons

Where the code asks whether two decimal numbers are exactly equal. A floating-point result can differ from another in the last digit after a few transformations, so a mesh run through several of them can change the length of an edge, or miss a match. Compare with < or > where a range is meant, and with a documented epsilon where equality is.

  • 316 comparisons to look at
  • 149 files
  • 175 likely to matter (against a decimal, or two computed values)
  • Scanned

Equality comparisons

These are places worth checking, not confirmed bugs. The scan reads how the code is written, not what it is meant to do, so some entries are fine as they are: a test against exactly 0 is often a deliberate guard against dividing by zero. It skips text, counts and indexes, and any comparison it cannot be sure involves decimal numbers, so there are likely more in the code than are listed here.

  • Two computed values dwg/objects-write.js:659 in insertScale DetailCraft, PartCraft
    else if (sx === sy && sx === sz) { w.BB(2); w.RD(sx); }

    === in sx === sy. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values dwg/objects-write.js:659 in insertScale DetailCraft, PartCraft
    else if (sx === sy && sx === sz) { w.BB(2); w.RD(sx); }

    === in sx === sz. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values stroke-clean.js:143 in cleanStroke MarkupCraft
    const sq = ang !== Math.atan2(last.y - first.y, last.x - first.x);

    !== in ang !== Math.atan2(last.y - first.y, last.x - first.x). Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values addons/flow/lib/sim.js:52 in less ModelCraft
    less(x, y) { return x.t < y.t || (x.t === y.t && (x.p < y.p || (x.p === y.p && x.s < y.s))); }

    === in x.t === y.t. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Material flow simulation.

  • Two computed values anim/curves-ui.js:255 in pickKeys ModelCraft
    for (const s of sel) { if (!/^p\d+$/.test(String(s.track))) continue; const tr = a.props?.[+s.track.slice(1)]; const i = tr ? tr.keys.findIndex((k) => k.t === s.t) : -1; if (i >= 0) for (let c = 0; c 

    === in k.t === s.t. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values anim/rig-view.js:190 in hitAt ModelCraft
    if (!this.S || this.S.m !== m || (!this.stroke && (this.S.topo !== m.topo || this.S.v !== m.v))) { this.S = new Sculptor(m); this.S.v = m.v; }

    !== in this.S.v !== m.v. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Bone frames and pose matrices.

  • Two computed values earcut.js:161 in findHoleBridge ModelCraft
    if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {

    !== in p.next.y !== p.y. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values earcut.js:179 in findHoleBridge ModelCraft
    if (locallyInside(p, hole) && (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {

    === in p.x === m.x. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values earcut.js:194 in getLeftmost ModelCraft
    if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;

    === in p.x === leftmost.x. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values earcut.js:217 in equals ModelCraft
    const equals = (p1, p2) => p1.x === p2.x && p1.y === p2.y;

    === in p1.x === p2.x. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values earcut.js:217 in equals ModelCraft
    const equals = (p1, p2) => p1.x === p2.x && p1.y === p2.y;

    === in p1.y === p2.y. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values earcut.js:247 in middleInside ModelCraft
    if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) inside = !inside;

    !== in p.next.y !== p.y. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values io/3dm/earcut.js:162 in findHoleBridge ModelCraft
    if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {

    !== in p.next.y !== p.y. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values io/3dm/earcut.js:180 in findHoleBridge ModelCraft
    if (locallyInside(p, hole) && (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {

    === in p.x === m.x. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values io/3dm/earcut.js:195 in getLeftmost ModelCraft
    if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;

    === in p.x === leftmost.x. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values io/3dm/earcut.js:218 in equals ModelCraft
    const equals = (p1, p2) => p1.x === p2.x && p1.y === p2.y;

    === in p1.x === p2.x. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values io/3dm/earcut.js:218 in equals ModelCraft
    const equals = (p1, p2) => p1.x === p2.x && p1.y === p2.y;

    === in p1.y === p2.y. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values io/3dm/earcut.js:248 in middleInside ModelCraft
    if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) inside = !inside;

    !== in p.next.y !== p.y. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values mesh/ops.js:920 in slideRails ModelCraft
    out.set(v, { a: dirs[0].w, b: dirs[dirs.length - 1].w === dirs[0].w ? -1 : dirs[dirs.length - 1].w });

    === in dirs[dirs.length - 1].w === dirs[0].w. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Proportional editing weights and edge creases, Inset, bevel and moves along normals, Subdivide, loop cut, bisect, knife and grid fill, Merge, spin, bridge, slide and smooth.

  • Two computed values mesh/pick.js:23 in fresh ModelCraft
    fresh() { return this.v === this.mesh.v && this.nh === this.mesh.nh; }

    === in this.v === this.mesh.v. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values mesh/sculpt-tool.js:33 in sculptor ModelCraft
    if (!this.S || this.S.m !== m || (!this.stroke && (this.S.topo !== m.topo || this.S.liveTopo !== m.liveTopo || this.S.v !== m.v))) { this.S = new Sculptor(m); this.S.v = m.v; }

    !== in this.S.v !== m.v. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Sculpt brushes.

  • Two computed values model.js:137 in meshGeometry ModelCraft
    if (g && g.v === mesh.v && !mesh.recording) return g.def;

    === in g.v === mesh.v. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values model.js:538 in addEdge ModelCraft
    if (stops[i].v === stops[i + 1].v) continue;

    === in stops[i].v === stops[i + 1].v. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values modelcraft.js:918 in init ModelCraft
    if (c.x !== pinch.c.x || c.y !== pinch.c.y) cam[move](c.x - pinch.c.x, c.y - pinch.c.y, pinch.pivot);

    !== in c.x !== pinch.c.x. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Entity info: volume, size, angle and area, Edits and settings from the main window.

  • Two computed values modelcraft.js:918 in init ModelCraft
    if (c.x !== pinch.c.x || c.y !== pinch.c.y) cam[move](c.x - pinch.c.x, c.y - pinch.c.y, pinch.pivot);

    !== in c.y !== pinch.c.y. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Entity info: volume, size, angle and area, Edits and settings from the main window.

  • Two computed values modelcraft.js:1223 in openCtxMenu ModelCraft
    if (s && !host.sel.some((x) => x.t === s.t && x.id === s.id)) host.setSel([s]);

    === in x.t === s.t. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Entity info: volume, size, angle and area, Edits and settings from the main window.

  • Two computed values nurbs/trim.js:163 in sameXY ModelCraft, PartCraft
    const sameXY = (a, b) => a.x === b.x && a.y === b.y;

    === in a.x === b.x. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Trimmed surfaces: loops, cut tessellation and area.

  • Two computed values nurbs/trim.js:163 in sameXY ModelCraft, PartCraft
    const sameXY = (a, b) => a.x === b.x && a.y === b.y;

    === in a.y === b.y. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Trimmed surfaces: loops, cut tessellation and area.

  • Two computed values nurbs/trim.js:209 in triangulate ModelCraft, PartCraft
    if ((a.y > M.y) === (b.y > M.y) && !(a.y === M.y || b.y === M.y)) continue;

    === in a.y === M.y. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Trimmed surfaces: loops, cut tessellation and area.

  • Two computed values nurbs/trim.js:209 in triangulate ModelCraft, PartCraft
    if ((a.y > M.y) === (b.y > M.y) && !(a.y === M.y || b.y === M.y)) continue;

    === in b.y === M.y. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Trimmed surfaces: loops, cut tessellation and area.

  • Two computed values nurbs/trim.js:210 in triangulate ModelCraft, PartCraft
    if (a.y === b.y) continue;

    === in a.y === b.y. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Trimmed surfaces: loops, cut tessellation and area.

  • Two computed values timeline.js:305 in refresh ModelCraft
    picked = picked.filter((p) => keysOf(p.track).some((k) => k.t === p.t));

    === in k.t === p.t. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values timeline.js:337 in keyOf ModelCraft
    return ks && ks.find((x) => x.t === p.t);

    === in x.t === p.t. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values tools.js:1060 in down ModelCraft
    const inSel = this.h.sel.some((x) => x.t === s.t && x.id === s.id);

    === in x.t === s.t. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values 3dm/earcut.js:162 in findHoleBridge PartCraft
    if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {

    !== in p.next.y !== p.y. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values 3dm/earcut.js:180 in findHoleBridge PartCraft
    if (locallyInside(p, hole) && (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {

    === in p.x === m.x. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values 3dm/earcut.js:195 in getLeftmost PartCraft
    if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;

    === in p.x === leftmost.x. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values 3dm/earcut.js:218 in equals PartCraft
    const equals = (p1, p2) => p1.x === p2.x && p1.y === p2.y;

    === in p1.x === p2.x. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values 3dm/earcut.js:218 in equals PartCraft
    const equals = (p1, p2) => p1.x === p2.x && p1.y === p2.y;

    === in p1.y === p2.y. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values 3dm/earcut.js:248 in middleInside PartCraft
    if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) inside = !inside;

    !== in p.next.y !== p.y. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values contact.js:159 in pairAll PartCraft
    if (!old || old.t !== best.t || Math.abs(old.L1 - best.L1) > 2e-3 || Math.abs(old.L2 - best.L2) > 2e-3) moved = true;

    !== in old.t !== best.t. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Contact between parts in stress analysis.

  • Two computed values illustrate/anim.js:129 in sortKeys PartCraft
    for (const k of keys) { if (out.length && out[out.length - 1].t === k.t) out[out.length - 1] = k; else out.push(k); }

    === in out[out.length - 1].t === k.t. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values illustrate/anim.js:467 in moveKeys PartCraft
    for (const k of x.keys) { const last = out[out.length - 1]; if (last && last.t === k.t) { if (moved.has(k) || !moved.has(last)) out[out.length - 1] = k; } else out.push(k); }

    === in last.t === k.t. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values assets/js/engines/des/engine.js:34 in less Shared shell, every app
    const less = (x, y) => x.t < y.t || (x.t === y.t && (x.pr < y.pr || (x.pr === y.pr && x.seq < y.seq)));

    === in x.t === y.t. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Flow simulation (discrete events).

  • Two computed values assets/js/engines/pcb/place.js:33 in place Shared shell, every app
    const stuck = free.length > 1 && free.every((p) => p.x === free[0].x && p.y === free[0].y);

    === in p.x === free[0].x. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Board placement and routing.

  • Two computed values assets/js/engines/pcb/place.js:33 in place Shared shell, every app
    const stuck = free.length > 1 && free.every((p) => p.x === free[0].x && p.y === free[0].y);

    === in p.y === free[0].y. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Board placement and routing.

  • Two computed values fixedqty.js:76 in importQuantities TakeoffCraft
    if (old.qty === q.qty && old.unit === q.unit) { out.same++; continue; }

    === in old.qty === q.qty. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Not in the register.

  • Two computed values model.js:641 in setMarksArea TakeoffCraft
    if (!set.has(m.id) || (m.area || null) === (area || null)) continue;

    === in (m.area || null) === (area || null). Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Takeoff quantities from marks, Priced estimate.

  • Two computed values model.js:934 in quantities TakeoffCraft
    if (area !== undefined && (m.area || null) !== area) continue;      // one bid area (null: the marks in none)

    !== in (m.area || null) !== area. Compare within a documented epsilon scaled to the size of the geometry, or restructure so one side is exact. Reviewed: Takeoff quantities from marks, Priced estimate.