80c0b6dPlate dynamics lab: plates in realizable mounts under gravity, explicit finite differences on WebGPUJeremy Magland 1/** Format a number as a MATLAB literal that round-trips exactly and reads well. */
2export function formatNumber(x: number): string {
3 if (!Number.isFinite(x)) return x > 0 ? "Inf" : x < 0 ? "-Inf" : "NaN";
4 if (x === 0) return "0";
5 const ax = Math.abs(x);
6 if (Number.isInteger(x) && ax < 1e6) return String(x);
7 if (ax >= 1e5 || ax < 1e-4) {
8 // shortest exponential form that round-trips, written like 200e9 rather than 2e+11
9 for (let p = 0; p <= 16; p++) {
10 const s = x.toExponential(p);
11 if (Number(s) === x) return tidyExponential(s);
12 }
13 return tidyExponential(x.toExponential());
14 }
15 return String(x);
16}
18function tidyExponential(s: string): string {
19 const [mant, expo] = s.split("e");
20 const e = Number(expo);
21 // Prefer engineering-style exponents (multiples of 3) when the mantissa stays short
22 const shift = ((e % 3) + 3) % 3;
23 if (shift !== 0) {
24 const mNum = Number(mant) * Math.pow(10, shift);
25 const mStr = String(Number(mNum.toPrecision(15)));
26 if (mStr.length <= 8) return `${mStr}e${e - shift}`;
27 }
28 return `${mant}e${e}`;
29}
31export function formatString(s: string): string {
32 return `'${s.replace(/'/g, "''")}'`;
33}
35export function formatVector(v: readonly number[]): string {
36 return `[${v.map(formatNumber).join(" ")}]`;
37}