@danielsimonjr/mathts-core 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2148,7 +2148,675 @@ var DimensionMismatchError = class extends Error {
2148
2148
  }
2149
2149
  };
2150
2150
 
2151
+ // src/types/unit/exact-scale.ts
2152
+ function gcd(a, b) {
2153
+ let x = a < 0n ? -a : a;
2154
+ let y = b < 0n ? -b : b;
2155
+ while (y !== 0n) [x, y] = [y, x % y];
2156
+ return x;
2157
+ }
2158
+ function make(num, den, pi) {
2159
+ if (den === 0n) throw new RangeError("exact scale: zero denominator");
2160
+ if (den < 0n) {
2161
+ num = -num;
2162
+ den = -den;
2163
+ }
2164
+ const g = gcd(num, den);
2165
+ return g > 1n ? { num: num / g, den: den / g, pi } : { num, den, pi };
2166
+ }
2167
+ var UNIT_EXACT_SCALE = Object.freeze({ num: 1n, den: 1n, pi: 0 });
2168
+ var PI_EXACT_SCALE = Object.freeze({ num: 1n, den: 1n, pi: 1 });
2169
+ var DECIMAL = /^([+-]?)(\d*)(?:\.(\d*))?(?:[eE]([+-]?\d+))?$/;
2170
+ function decimalExactScale(text) {
2171
+ const m = DECIMAL.exec(text.trim());
2172
+ if (m === null) return null;
2173
+ const whole = m[2] ?? "";
2174
+ const fraction = m[3] ?? "";
2175
+ if (whole === "" && fraction === "") return null;
2176
+ const exponent = Number(m[4] ?? "0") - fraction.length;
2177
+ if (!Number.isSafeInteger(exponent) || Math.abs(exponent) > 1e4) return null;
2178
+ let num = BigInt(whole + fraction);
2179
+ if (m[1] === "-") num = -num;
2180
+ return exponent >= 0 ? make(num * 10n ** BigInt(exponent), 1n, 0) : make(num, 10n ** BigInt(-exponent), 0);
2181
+ }
2182
+ function exactScaleOf(x) {
2183
+ if (!Number.isFinite(x)) throw new RangeError(`exact scale: ${x} is not finite`);
2184
+ return decimalExactScale(String(x));
2185
+ }
2186
+ function binaryExactScale(x) {
2187
+ if (!Number.isFinite(x)) throw new RangeError(`exact scale: ${x} is not finite`);
2188
+ if (x === 0) return make(0n, 1n, 0);
2189
+ const view = new DataView(new ArrayBuffer(8));
2190
+ view.setFloat64(0, x);
2191
+ const bits = view.getBigUint64(0);
2192
+ const negative = bits >> 63n === 1n;
2193
+ const biased = Number(bits >> 52n & 0x7ffn);
2194
+ const fraction = bits & (1n << 52n) - 1n;
2195
+ const mantissa = biased === 0 ? fraction : fraction | 1n << 52n;
2196
+ const exponent = (biased === 0 ? 1 : biased) - 1075;
2197
+ const num = negative ? -mantissa : mantissa;
2198
+ return exponent >= 0 ? make(num << BigInt(exponent), 1n, 0) : make(num, 1n << BigInt(-exponent), 0);
2199
+ }
2200
+ function ratioExactScale(num, den = 1n) {
2201
+ return make(BigInt(num), BigInt(den), 0);
2202
+ }
2203
+ function multiplyExactScales(...factors) {
2204
+ let num = 1n;
2205
+ let den = 1n;
2206
+ let pi = 0;
2207
+ for (const f of factors) {
2208
+ num *= f.num;
2209
+ den *= f.den;
2210
+ pi += f.pi;
2211
+ }
2212
+ return make(num, den, pi);
2213
+ }
2214
+ function divideExactScales(a, b) {
2215
+ if (b.num === 0n) throw new RangeError("exact scale: division by zero");
2216
+ return make(a.num * b.den, a.den * b.num, a.pi - b.pi);
2217
+ }
2218
+ function powerExactScale(a, n) {
2219
+ if (!Number.isInteger(n)) throw new RangeError(`exact scale: power ${n} is not an integer`);
2220
+ const k = BigInt(Math.abs(n));
2221
+ const up = make(a.num ** k, a.den ** k, a.pi * Math.abs(n));
2222
+ return n >= 0 ? up : divideExactScales(UNIT_EXACT_SCALE, up);
2223
+ }
2224
+ function exactScalesEqual(a, b) {
2225
+ return a.num === b.num && a.den === b.den && (a.num === 0n || a.pi === b.pi);
2226
+ }
2227
+ function addExactScales(a, b) {
2228
+ if (a.num === 0n) return b;
2229
+ if (b.num === 0n) return a;
2230
+ if (a.pi !== b.pi) return null;
2231
+ return make(a.num * b.den + b.num * a.den, a.den * b.den, a.pi);
2232
+ }
2233
+ var PI_DIGITS = "3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647";
2234
+ var PI_NUM = BigInt(PI_DIGITS);
2235
+ var PI_DEN = 10n ** BigInt(PI_DIGITS.length - 1);
2236
+ var MIN_DIGITS = 40;
2237
+ function terminatingPlaces(den) {
2238
+ let d = den;
2239
+ let twos = 0;
2240
+ let fives = 0;
2241
+ while (d % 2n === 0n) {
2242
+ d /= 2n;
2243
+ twos++;
2244
+ }
2245
+ while (d % 5n === 0n) {
2246
+ d /= 5n;
2247
+ fives++;
2248
+ }
2249
+ return d === 1n ? Math.max(twos, fives) : null;
2250
+ }
2251
+ function rationalToNumber(num, den) {
2252
+ if (num === 0n) return 0;
2253
+ const negative = num < 0n;
2254
+ const g = gcd(num, den);
2255
+ const a = (negative ? -num : num) / g;
2256
+ den /= g;
2257
+ const places = terminatingPlaces(den);
2258
+ if (places !== null) {
2259
+ const value2 = Number(`${a * 10n ** BigInt(places) / den}e-${places}`);
2260
+ return negative ? -value2 : value2;
2261
+ }
2262
+ const digits2 = Math.max(MIN_DIGITS, den.toString().length + 20);
2263
+ const shift = digits2 - (a.toString().length - den.toString().length);
2264
+ const q = shift >= 0 ? a * 10n ** BigInt(shift) / den : a / (den * 10n ** BigInt(-shift));
2265
+ const value = Number(`${q.toString()}1e${-(shift + 1)}`);
2266
+ return negative ? -value : value;
2267
+ }
2268
+ function exactScaleToNumber(s) {
2269
+ if (s.pi === 0) return rationalToNumber(s.num, s.den);
2270
+ const k = BigInt(Math.abs(s.pi));
2271
+ return s.pi > 0 ? rationalToNumber(s.num * PI_NUM ** k, s.den * PI_DEN ** k) : rationalToNumber(s.num * PI_DEN ** k, s.den * PI_NUM ** k);
2272
+ }
2273
+ function formatExactScale(s) {
2274
+ const rational = s.den === 1n ? `${s.num}` : `${s.num}/${s.den}`;
2275
+ if (s.pi === 0) return rational;
2276
+ return `${rational}*pi${s.pi === 1 ? "" : `^${s.pi}`}`;
2277
+ }
2278
+ var FACTOR = /^([^*/^\s()]+)(?:\^([+-]?\d+))?$/;
2279
+ function readScaleExpression(text, resolve = () => void 0) {
2280
+ const product = (side) => {
2281
+ let scale = UNIT_EXACT_SCALE;
2282
+ for (const part of side.split("*")) {
2283
+ const m = FACTOR.exec(part);
2284
+ if (m === null) throw new RangeError(`exact scale: '${text}' is not a product of factors`);
2285
+ const atom = m[1];
2286
+ const base = decimalExactScale(atom) ?? (atom === "pi" ? PI_EXACT_SCALE : resolve(atom));
2287
+ if (base === void 0) {
2288
+ throw new RangeError(`exact scale: '${text}' names '${atom}', which is not a known scale`);
2289
+ }
2290
+ scale = multiplyExactScales(
2291
+ scale,
2292
+ m[2] === void 0 ? base : powerExactScale(base, Number(m[2]))
2293
+ );
2294
+ }
2295
+ return scale;
2296
+ };
2297
+ const trimmed = text.trim();
2298
+ const parts = trimmed.split("/");
2299
+ const top = product(parts[0]);
2300
+ return parts.length > 1 ? divideExactScales(top, product(parts.slice(1).join("*"))) : top;
2301
+ }
2302
+
2303
+ // src/types/unit/unit-table.ts
2304
+ var SI_PREFIX_LIST = [
2305
+ ["da", "deca", 1, false],
2306
+ ["h", "hecto", 2, false],
2307
+ ["k", "kilo", 3, true],
2308
+ ["M", "mega", 6, true],
2309
+ ["G", "giga", 9, true],
2310
+ ["T", "tera", 12, true],
2311
+ ["P", "peta", 15, true],
2312
+ ["E", "exa", 18, true],
2313
+ ["Z", "zetta", 21, true],
2314
+ ["Y", "yotta", 24, true],
2315
+ ["R", "ronna", 27, true],
2316
+ ["Q", "quetta", 30, true],
2317
+ ["d", "deci", -1, false],
2318
+ ["c", "centi", -2, false],
2319
+ ["m", "milli", -3, true],
2320
+ ["u", "micro", -6, true],
2321
+ ["n", "nano", -9, true],
2322
+ ["p", "pico", -12, true],
2323
+ ["f", "femto", -15, true],
2324
+ ["a", "atto", -18, true],
2325
+ ["z", "zepto", -21, true],
2326
+ ["y", "yocto", -24, true],
2327
+ ["r", "ronto", -27, true],
2328
+ ["q", "quecto", -30, true]
2329
+ ];
2330
+ var IEC_PREFIX_LIST = [
2331
+ ["Ki", "kibi", 1],
2332
+ ["Mi", "mebi", 2],
2333
+ ["Gi", "gibi", 3],
2334
+ ["Ti", "tebi", 4],
2335
+ ["Pi", "pebi", 5],
2336
+ ["Ei", "exi", 6],
2337
+ ["Zi", "zebi", 7],
2338
+ ["Yi", "yobi", 8]
2339
+ ];
2340
+ function prefixSet(entries) {
2341
+ const set2 = { "": { radix: 10, power: 0, scientific: true } };
2342
+ for (const [name2, power, scientific, radix] of entries) {
2343
+ set2[name2] = Object.freeze({ radix: radix ?? 10, power, scientific });
2344
+ }
2345
+ return Object.freeze(set2);
2346
+ }
2347
+ var siShort = (scale, keep = () => true) => prefixSet(
2348
+ SI_PREFIX_LIST.filter(([, , p]) => keep(p)).map(
2349
+ ([short, , p, sci]) => [short, p * scale, sci]
2350
+ )
2351
+ );
2352
+ var siLong = (keep = () => true) => prefixSet(
2353
+ SI_PREFIX_LIST.filter(([, , p]) => keep(p)).map(([, long, p, sci]) => [long, p, sci])
2354
+ );
2355
+ var upToYotta = (p) => p >= 3 && p <= 24;
2356
+ var UNIT_PREFIX_SETS = Object.freeze({
2357
+ NONE: prefixSet([]),
2358
+ SHORT: siShort(1),
2359
+ LONG: siLong(),
2360
+ SHORTLONG: Object.freeze({ ...siShort(1), ...siLong() }),
2361
+ SQUARED: siShort(2),
2362
+ CUBIC: siShort(3),
2363
+ BINARY_SHORT: Object.freeze({
2364
+ ...siShort(1, upToYotta),
2365
+ ...prefixSet(IEC_PREFIX_LIST.map(([short, , p]) => [short, p, true, 1024]))
2366
+ }),
2367
+ BINARY_LONG: Object.freeze({
2368
+ ...siLong(upToYotta),
2369
+ ...prefixSet(IEC_PREFIX_LIST.map(([, long, p]) => [long, p, true, 1024]))
2370
+ }),
2371
+ BTU: prefixSet([["MM", 6, true]]),
2372
+ SHORT_UP_ONLY: siShort(1, (p) => p >= 3)
2373
+ });
2374
+ function unitPrefixExactScale(prefix) {
2375
+ return powerExactScale(ratioExactScale(prefix.radix), prefix.power);
2376
+ }
2377
+ function getUnitPrefix(unit, name2) {
2378
+ const row = getUnitRow(unit);
2379
+ if (row === void 0) return void 0;
2380
+ const set2 = UNIT_PREFIX_SETS[row.prefixes];
2381
+ return Object.prototype.hasOwnProperty.call(set2, name2) ? set2[name2] : void 0;
2382
+ }
2383
+ var NAMED_SCALES = Object.freeze({
2384
+ /** International inch, International Yard and Pound Agreement (1959). */
2385
+ inch: "0.0254",
2386
+ foot: "12*inch",
2387
+ yard: "3*foot",
2388
+ mile: "5280*foot",
2389
+ /** International avoirdupois pound, International Yard and Pound Agreement (1959). */
2390
+ pound: "0.45359237",
2391
+ /** Standard acceleration of gravity, 3rd CGPM (1901). */
2392
+ standard_gravity: "9.80665",
2393
+ /** Pound-force: one pound times standard gravity. */
2394
+ lbf: "pound*standard_gravity",
2395
+ /** US gallon: 231 cubic inches. */
2396
+ us_gallon: "231*inch^3",
2397
+ us_fluid_ounce: "us_gallon/128",
2398
+ /** Julian year, 365.25 days (IAU). */
2399
+ julian_year: "365.25*86400",
2400
+ /** Speed of light in vacuum, exact in the SI. */
2401
+ speed_of_light: "299792458",
2402
+ /** Astronomical unit, IAU 2012 Resolution B2. */
2403
+ astronomical_unit: "149597870700",
2404
+ /** Standard atmosphere, 10th CGPM (1954). */
2405
+ standard_atmosphere: "101325",
2406
+ /** International Table calorie (1956). */
2407
+ calorie_IT: "4.1868"
2408
+ });
2409
+ var UNIT_ROWS = Object.freeze({
2410
+ meter: { base: "LENGTH", prefixes: "LONG", scale: "1" },
2411
+ inch: { base: "LENGTH", prefixes: "NONE", scale: "inch" },
2412
+ foot: { base: "LENGTH", prefixes: "NONE", scale: "foot" },
2413
+ yard: { base: "LENGTH", prefixes: "NONE", scale: "yard" },
2414
+ mile: { base: "LENGTH", prefixes: "NONE", scale: "mile" },
2415
+ link: { base: "LENGTH", prefixes: "NONE", scale: "0.66*foot" },
2416
+ // Gunter link, 0.66 ft (international foot)
2417
+ rod: { base: "LENGTH", prefixes: "NONE", scale: "16.5*foot" },
2418
+ // 16.5 ft (international foot)
2419
+ chain: { base: "LENGTH", prefixes: "NONE", scale: "66*foot" },
2420
+ // 66 ft (international foot)
2421
+ angstrom: { base: "LENGTH", prefixes: "NONE", scale: "1e-10" },
2422
+ astronomicalUnit: { base: "LENGTH", prefixes: "NONE", scale: "astronomical_unit" },
2423
+ // IAU 2012 Resolution B2
2424
+ lightyear: { base: "LENGTH", prefixes: "NONE", scale: "speed_of_light*julian_year" },
2425
+ // c × Julian year (IAU)
2426
+ ly: { base: "LENGTH", prefixes: "SHORT_UP_ONLY", scale: "speed_of_light*julian_year" },
2427
+ // c × Julian year (IAU)
2428
+ parsec: { base: "LENGTH", prefixes: "LONG", scale: "648000*astronomical_unit/pi" },
2429
+ // IAU 2015 Resolution B2: 648000/π au
2430
+ pc: { base: "LENGTH", prefixes: "SHORT_UP_ONLY", scale: "648000*astronomical_unit/pi" },
2431
+ // IAU 2015 Resolution B2: 648000/π au
2432
+ nauticalMile: { base: "LENGTH", prefixes: "NONE", scale: "1852" },
2433
+ fathom: { base: "LENGTH", prefixes: "NONE", scale: "6*foot" },
2434
+ // 6 ft
2435
+ furlong: { base: "LENGTH", prefixes: "NONE", scale: "660*foot" },
2436
+ // 660 ft (1/8 mile)
2437
+ point: { base: "LENGTH", prefixes: "NONE", scale: "inch/72" },
2438
+ // 1/72 inch (PostScript point)
2439
+ pica: { base: "LENGTH", prefixes: "NONE", scale: "inch/6" },
2440
+ // 12 points = 1/6 inch
2441
+ m: { base: "LENGTH", prefixes: "SHORT", scale: "1" },
2442
+ in: { base: "LENGTH", prefixes: "NONE", scale: "inch" },
2443
+ ft: { base: "LENGTH", prefixes: "NONE", scale: "foot" },
2444
+ yd: { base: "LENGTH", prefixes: "NONE", scale: "yard" },
2445
+ mi: { base: "LENGTH", prefixes: "NONE", scale: "mile" },
2446
+ li: { base: "LENGTH", prefixes: "NONE", scale: "0.66*foot" },
2447
+ rd: { base: "LENGTH", prefixes: "NONE", scale: "16.5*foot" },
2448
+ // 16.5 ft (international foot)
2449
+ ch: { base: "LENGTH", prefixes: "NONE", scale: "66*foot" },
2450
+ // 66 ft
2451
+ mil: { base: "LENGTH", prefixes: "NONE", scale: "0.001*inch" },
2452
+ // 1/1000 inch
2453
+ m2: { base: "SURFACE", prefixes: "SQUARED", scale: "1" },
2454
+ sqin: { base: "SURFACE", prefixes: "NONE", scale: "inch^2" },
2455
+ sqft: { base: "SURFACE", prefixes: "NONE", scale: "foot^2" },
2456
+ sqyd: { base: "SURFACE", prefixes: "NONE", scale: "yard^2" },
2457
+ sqmi: { base: "SURFACE", prefixes: "NONE", scale: "mile^2" },
2458
+ sqrd: { base: "SURFACE", prefixes: "NONE", scale: "272.25*foot^2" },
2459
+ // (16.5 ft)^2
2460
+ sqch: { base: "SURFACE", prefixes: "NONE", scale: "4356*foot^2" },
2461
+ // (66 ft)^2
2462
+ sqmil: { base: "SURFACE", prefixes: "NONE", scale: "1e-6*inch^2" },
2463
+ acre: { base: "SURFACE", prefixes: "NONE", scale: "43560*foot^2" },
2464
+ // 43 560 ft^2 (international acre)
2465
+ hectare: { base: "SURFACE", prefixes: "NONE", scale: "1e4" },
2466
+ m3: { base: "VOLUME", prefixes: "CUBIC", scale: "1" },
2467
+ L: { base: "VOLUME", prefixes: "SHORT", scale: "1e-3" },
2468
+ l: { base: "VOLUME", prefixes: "SHORT", scale: "1e-3" },
2469
+ litre: { base: "VOLUME", prefixes: "LONG", scale: "1e-3" },
2470
+ cuin: { base: "VOLUME", prefixes: "NONE", scale: "inch^3" },
2471
+ cuft: { base: "VOLUME", prefixes: "NONE", scale: "foot^3" },
2472
+ cuyd: { base: "VOLUME", prefixes: "NONE", scale: "yard^3" },
2473
+ teaspoon: { base: "VOLUME", prefixes: "NONE", scale: "5e-6" },
2474
+ // metric teaspoon, 5 mL (not the US customary 4.93 mL)
2475
+ tablespoon: { base: "VOLUME", prefixes: "NONE", scale: "15e-6" },
2476
+ // metric tablespoon, 15 mL (not the US customary 14.79 mL)
2477
+ drop: { base: "VOLUME", prefixes: "NONE", scale: "5e-8" },
2478
+ // 0.05 mL (medical convention)
2479
+ gtt: { base: "VOLUME", prefixes: "NONE", scale: "5e-8" },
2480
+ // 0.05 mL (medical convention)
2481
+ minim: { base: "VOLUME", prefixes: "NONE", scale: "us_fluid_ounce/480" },
2482
+ // 1/480 US fl oz
2483
+ fluiddram: { base: "VOLUME", prefixes: "NONE", scale: "us_fluid_ounce/8" },
2484
+ // 1/8 US fl oz
2485
+ fluidounce: { base: "VOLUME", prefixes: "NONE", scale: "us_fluid_ounce" },
2486
+ gill: { base: "VOLUME", prefixes: "NONE", scale: "4*us_fluid_ounce" },
2487
+ // 4 US fl oz
2488
+ cc: { base: "VOLUME", prefixes: "NONE", scale: "1e-6" },
2489
+ cup: { base: "VOLUME", prefixes: "NONE", scale: "8*us_fluid_ounce" },
2490
+ // US customary cup, 8 US fl oz
2491
+ pint: { base: "VOLUME", prefixes: "NONE", scale: "16*us_fluid_ounce" },
2492
+ // US liquid pint
2493
+ quart: { base: "VOLUME", prefixes: "NONE", scale: "32*us_fluid_ounce" },
2494
+ // US liquid quart
2495
+ gallon: { base: "VOLUME", prefixes: "NONE", scale: "us_gallon" },
2496
+ // US gallon, 231 in^3
2497
+ beerbarrel: { base: "VOLUME", prefixes: "NONE", scale: "31*us_gallon" },
2498
+ // 31 US gal
2499
+ oilbarrel: { base: "VOLUME", prefixes: "NONE", scale: "42*us_gallon" },
2500
+ // 42 US gal
2501
+ hogshead: { base: "VOLUME", prefixes: "NONE", scale: "63*us_gallon" },
2502
+ // 63 US gal
2503
+ g: { base: "MASS", prefixes: "SHORT", scale: "1e-3" },
2504
+ gram: { base: "MASS", prefixes: "LONG", scale: "1e-3" },
2505
+ ton: { base: "MASS", prefixes: "SHORT", scale: "2000*pound" },
2506
+ // US short ton, 2000 lb
2507
+ t: { base: "MASS", prefixes: "SHORT", scale: "1000" },
2508
+ tonne: { base: "MASS", prefixes: "LONG", scale: "1000" },
2509
+ grain: { base: "MASS", prefixes: "NONE", scale: "pound/7000" },
2510
+ // 1/7000 lb
2511
+ dram: { base: "MASS", prefixes: "NONE", scale: "pound/256" },
2512
+ // avoirdupois dram, 1/256 lb
2513
+ ounce: { base: "MASS", prefixes: "NONE", scale: "pound/16" },
2514
+ // avoirdupois ounce
2515
+ poundmass: { base: "MASS", prefixes: "NONE", scale: "pound" },
2516
+ hundredweight: { base: "MASS", prefixes: "NONE", scale: "100*pound" },
2517
+ // US short hundredweight, 100 lb
2518
+ stick: { base: "MASS", prefixes: "NONE", scale: "0.115" },
2519
+ // butter stick (as in mathjs)
2520
+ stone: { base: "MASS", prefixes: "NONE", scale: "14*pound" },
2521
+ // 14 lb
2522
+ gr: { base: "MASS", prefixes: "NONE", scale: "pound/7000" },
2523
+ dr: { base: "MASS", prefixes: "NONE", scale: "pound/256" },
2524
+ oz: { base: "MASS", prefixes: "NONE", scale: "pound/16" },
2525
+ lbm: { base: "MASS", prefixes: "NONE", scale: "pound" },
2526
+ cwt: { base: "MASS", prefixes: "NONE", scale: "100*pound" },
2527
+ s: { base: "TIME", prefixes: "SHORT", scale: "1" },
2528
+ min: { base: "TIME", prefixes: "NONE", scale: "60" },
2529
+ h: { base: "TIME", prefixes: "NONE", scale: "3600" },
2530
+ second: { base: "TIME", prefixes: "LONG", scale: "1" },
2531
+ sec: { base: "TIME", prefixes: "LONG", scale: "1" },
2532
+ minute: { base: "TIME", prefixes: "NONE", scale: "60" },
2533
+ hour: { base: "TIME", prefixes: "NONE", scale: "3600" },
2534
+ day: { base: "TIME", prefixes: "NONE", scale: "86400" },
2535
+ week: { base: "TIME", prefixes: "NONE", scale: "7*86400" },
2536
+ month: { base: "TIME", prefixes: "NONE", scale: "julian_year/12" },
2537
+ // 1/12 Julian year
2538
+ year: { base: "TIME", prefixes: "NONE", scale: "julian_year" },
2539
+ // Julian year
2540
+ decade: { base: "TIME", prefixes: "NONE", scale: "10*julian_year" },
2541
+ // 10 Julian years
2542
+ century: { base: "TIME", prefixes: "NONE", scale: "100*julian_year" },
2543
+ // 100 Julian years
2544
+ millennium: { base: "TIME", prefixes: "NONE", scale: "1000*julian_year" },
2545
+ // 1000 Julian years
2546
+ hertz: { base: "FREQUENCY", prefixes: "LONG", scale: "1", name: "Hertz", reciprocal: true },
2547
+ Hz: { base: "FREQUENCY", prefixes: "SHORT", scale: "1", reciprocal: true },
2548
+ rad: { base: "ANGLE", prefixes: "SHORT", scale: "1" },
2549
+ radian: { base: "ANGLE", prefixes: "LONG", scale: "1" },
2550
+ deg: { base: "ANGLE", prefixes: "SHORT", scale: "pi/180" },
2551
+ degree: { base: "ANGLE", prefixes: "LONG", scale: "pi/180" },
2552
+ grad: { base: "ANGLE", prefixes: "SHORT", scale: "pi/200" },
2553
+ gradian: { base: "ANGLE", prefixes: "LONG", scale: "pi/200" },
2554
+ cycle: { base: "ANGLE", prefixes: "NONE", scale: "2*pi" },
2555
+ // one turn, 2π rad
2556
+ arcsec: { base: "ANGLE", prefixes: "NONE", scale: "pi/648000" },
2557
+ arcmin: { base: "ANGLE", prefixes: "NONE", scale: "pi/10800" },
2558
+ A: { base: "CURRENT", prefixes: "SHORT", scale: "1" },
2559
+ ampere: { base: "CURRENT", prefixes: "LONG", scale: "1" },
2560
+ K: { base: "TEMPERATURE", prefixes: "SHORT", scale: "1" },
2561
+ degC: { base: "TEMPERATURE", prefixes: "SHORT", scale: "1", offset: "273.15" },
2562
+ // K = °C + 273.15
2563
+ degF: { base: "TEMPERATURE", prefixes: "SHORT", scale: "5/9", offset: "459.67" },
2564
+ // K = (°F + 459.67) × 5/9
2565
+ degR: { base: "TEMPERATURE", prefixes: "SHORT", scale: "5/9" },
2566
+ // K = °R × 5/9
2567
+ kelvin: { base: "TEMPERATURE", prefixes: "LONG", scale: "1" },
2568
+ celsius: { base: "TEMPERATURE", prefixes: "LONG", scale: "1", offset: "273.15" },
2569
+ fahrenheit: { base: "TEMPERATURE", prefixes: "LONG", scale: "5/9", offset: "459.67" },
2570
+ rankine: { base: "TEMPERATURE", prefixes: "LONG", scale: "5/9" },
2571
+ mol: { base: "AMOUNT_OF_SUBSTANCE", prefixes: "SHORT", scale: "1" },
2572
+ mole: { base: "AMOUNT_OF_SUBSTANCE", prefixes: "LONG", scale: "1" },
2573
+ cd: { base: "LUMINOUS_INTENSITY", prefixes: "SHORT", scale: "1" },
2574
+ candela: { base: "LUMINOUS_INTENSITY", prefixes: "LONG", scale: "1" },
2575
+ sr: { base: "SOLID_ANGLE", prefixes: "NONE", scale: "1" },
2576
+ steradian: { base: "SOLID_ANGLE", prefixes: "LONG", scale: "1" },
2577
+ N: { base: "FORCE", prefixes: "SHORT", scale: "1" },
2578
+ newton: { base: "FORCE", prefixes: "LONG", scale: "1" },
2579
+ dyn: { base: "FORCE", prefixes: "SHORT", scale: "1e-5" },
2580
+ dyne: { base: "FORCE", prefixes: "LONG", scale: "1e-5" },
2581
+ lbf: { base: "FORCE", prefixes: "NONE", scale: "lbf" },
2582
+ poundforce: { base: "FORCE", prefixes: "NONE", scale: "lbf" },
2583
+ kip: { base: "FORCE", prefixes: "LONG", scale: "1000*lbf" },
2584
+ // 1000 lbf
2585
+ kilogramforce: { base: "FORCE", prefixes: "NONE", scale: "standard_gravity" },
2586
+ // standard gravity × 1 kg
2587
+ J: { base: "ENERGY", prefixes: "SHORT", scale: "1" },
2588
+ joule: { base: "ENERGY", prefixes: "LONG", scale: "1" },
2589
+ erg: { base: "ENERGY", prefixes: "SHORTLONG", scale: "1e-7" },
2590
+ Wh: { base: "ENERGY", prefixes: "SHORT", scale: "3600" },
2591
+ cal: { base: "ENERGY", prefixes: "SHORT", scale: "4.184" },
2592
+ // thermochemical calorie, 4.184 J exactly (NIST SP 811). Not cal_IT = 4.1868 J
2593
+ calorie: { base: "ENERGY", prefixes: "LONG", scale: "4.184" },
2594
+ // thermochemical calorie
2595
+ BTU: { base: "ENERGY", prefixes: "BTU", scale: "1000*calorie_IT*pound/1.8" },
2596
+ // International Table BTU: cal_IT × (lb/g) / 1.8
2597
+ eV: { base: "ENERGY", prefixes: "SHORT", scale: "1.602176634e-19" },
2598
+ // e × 1 V, exact since the 2019 SI
2599
+ electronvolt: { base: "ENERGY", prefixes: "LONG", scale: "1.602176634e-19" },
2600
+ W: { base: "POWER", prefixes: "SHORT", scale: "1" },
2601
+ watt: { base: "POWER", prefixes: "LONG", scale: "1" },
2602
+ hp: { base: "POWER", prefixes: "NONE", scale: "550*foot*lbf" },
2603
+ // mechanical horsepower, 550 ft·lbf/s
2604
+ VAR: { base: "POWER", prefixes: "SHORT", scale: "1", imaginary: true },
2605
+ // reactive power: the value is the imaginary unit times this scale
2606
+ VA: { base: "POWER", prefixes: "SHORT", scale: "1" },
2607
+ Pa: { base: "PRESSURE", prefixes: "SHORT", scale: "1" },
2608
+ psi: { base: "PRESSURE", prefixes: "NONE", scale: "lbf/inch^2" },
2609
+ // lbf/in^2
2610
+ atm: { base: "PRESSURE", prefixes: "NONE", scale: "standard_atmosphere" },
2611
+ // standard atmosphere
2612
+ bar: { base: "PRESSURE", prefixes: "SHORTLONG", scale: "1e5" },
2613
+ torr: { base: "PRESSURE", prefixes: "NONE", scale: "standard_atmosphere/760" },
2614
+ // 1/760 atm (exact)
2615
+ mmHg: { base: "PRESSURE", prefixes: "NONE", scale: "13.5951*standard_gravity" },
2616
+ // conventional mmHg: 13.5951 g/cm^3 × g_n × 1 mm = 133.322387415 Pa (NIST SP 811). Not the torr
2617
+ mmH2O: { base: "PRESSURE", prefixes: "NONE", scale: "standard_gravity" },
2618
+ // conventional: 1000 kg/m^3 × g_n × 1 mm
2619
+ cmH2O: { base: "PRESSURE", prefixes: "NONE", scale: "10*standard_gravity" },
2620
+ // conventional: 1000 kg/m^3 × g_n × 1 cm
2621
+ coulomb: { base: "ELECTRIC_CHARGE", prefixes: "LONG", scale: "1" },
2622
+ C: { base: "ELECTRIC_CHARGE", prefixes: "SHORT", scale: "1" },
2623
+ farad: { base: "ELECTRIC_CAPACITANCE", prefixes: "LONG", scale: "1" },
2624
+ F: { base: "ELECTRIC_CAPACITANCE", prefixes: "SHORT", scale: "1" },
2625
+ volt: { base: "ELECTRIC_POTENTIAL", prefixes: "LONG", scale: "1" },
2626
+ V: { base: "ELECTRIC_POTENTIAL", prefixes: "SHORT", scale: "1" },
2627
+ ohm: { base: "ELECTRIC_RESISTANCE", prefixes: "SHORTLONG", scale: "1" },
2628
+ henry: { base: "ELECTRIC_INDUCTANCE", prefixes: "LONG", scale: "1" },
2629
+ H: { base: "ELECTRIC_INDUCTANCE", prefixes: "SHORT", scale: "1" },
2630
+ siemens: { base: "ELECTRIC_CONDUCTANCE", prefixes: "LONG", scale: "1" },
2631
+ S: { base: "ELECTRIC_CONDUCTANCE", prefixes: "SHORT", scale: "1" },
2632
+ weber: { base: "MAGNETIC_FLUX", prefixes: "LONG", scale: "1" },
2633
+ Wb: { base: "MAGNETIC_FLUX", prefixes: "SHORT", scale: "1" },
2634
+ tesla: { base: "MAGNETIC_FLUX_DENSITY", prefixes: "LONG", scale: "1" },
2635
+ T: { base: "MAGNETIC_FLUX_DENSITY", prefixes: "SHORT", scale: "1" },
2636
+ b: { base: "BIT", prefixes: "BINARY_SHORT", scale: "1" },
2637
+ // bit: its own BIT dimension (storage), not ln 2 nat
2638
+ bits: { base: "BIT", prefixes: "BINARY_LONG", scale: "1" },
2639
+ B: { base: "BIT", prefixes: "BINARY_SHORT", scale: "8" },
2640
+ // byte, 8 bits
2641
+ bytes: { base: "BIT", prefixes: "BINARY_LONG", scale: "8" }
2642
+ });
2643
+ var UNIT_ROW_ALIASES = Object.freeze({
2644
+ meters: "meter",
2645
+ // Astronomical / nautical / typography aliases (B-5 port). Lowercase
2646
+ // 'au' is deliberately ABSENT: it collides with the atomic unit of
2647
+ // length (Bohr radius, ~5.29e-11 m), 21 orders of magnitude smaller.
2648
+ AU: "astronomicalUnit",
2649
+ astronomicalUnits: "astronomicalUnit",
2650
+ lightyears: "lightyear",
2651
+ parsecs: "parsec",
2652
+ nmi: "nauticalMile",
2653
+ nauticalMiles: "nauticalMile",
2654
+ fathoms: "fathom",
2655
+ furlongs: "furlong",
2656
+ points: "point",
2657
+ picas: "pica",
2658
+ inches: "inch",
2659
+ feet: "foot",
2660
+ yards: "yard",
2661
+ miles: "mile",
2662
+ links: "link",
2663
+ rods: "rod",
2664
+ chains: "chain",
2665
+ angstroms: "angstrom",
2666
+ lt: "l",
2667
+ litres: "litre",
2668
+ liter: "litre",
2669
+ liters: "litre",
2670
+ teaspoons: "teaspoon",
2671
+ tablespoons: "tablespoon",
2672
+ minims: "minim",
2673
+ fldr: "fluiddram",
2674
+ fluiddrams: "fluiddram",
2675
+ floz: "fluidounce",
2676
+ fluidounces: "fluidounce",
2677
+ gi: "gill",
2678
+ gills: "gill",
2679
+ cp: "cup",
2680
+ cups: "cup",
2681
+ pt: "pint",
2682
+ pints: "pint",
2683
+ qt: "quart",
2684
+ quarts: "quart",
2685
+ gal: "gallon",
2686
+ gallons: "gallon",
2687
+ bbl: "beerbarrel",
2688
+ beerbarrels: "beerbarrel",
2689
+ obl: "oilbarrel",
2690
+ oilbarrels: "oilbarrel",
2691
+ hogsheads: "hogshead",
2692
+ gtts: "gtt",
2693
+ grams: "gram",
2694
+ tons: "ton",
2695
+ tonnes: "tonne",
2696
+ grains: "grain",
2697
+ drams: "dram",
2698
+ ounces: "ounce",
2699
+ poundmasses: "poundmass",
2700
+ hundredweights: "hundredweight",
2701
+ sticks: "stick",
2702
+ lb: "lbm",
2703
+ lbs: "lbm",
2704
+ kips: "kip",
2705
+ kgf: "kilogramforce",
2706
+ acres: "acre",
2707
+ hectares: "hectare",
2708
+ sqfeet: "sqft",
2709
+ sqyard: "sqyd",
2710
+ sqmile: "sqmi",
2711
+ sqmiles: "sqmi",
2712
+ mmhg: "mmHg",
2713
+ mmh2o: "mmH2O",
2714
+ cmh2o: "cmH2O",
2715
+ seconds: "second",
2716
+ secs: "second",
2717
+ minutes: "minute",
2718
+ mins: "minute",
2719
+ hours: "hour",
2720
+ hr: "hour",
2721
+ hrs: "hour",
2722
+ days: "day",
2723
+ weeks: "week",
2724
+ months: "month",
2725
+ years: "year",
2726
+ decades: "decade",
2727
+ centuries: "century",
2728
+ millennia: "millennium",
2729
+ hertz: "hertz",
2730
+ radians: "radian",
2731
+ degrees: "degree",
2732
+ gradians: "gradian",
2733
+ cycles: "cycle",
2734
+ arcsecond: "arcsec",
2735
+ arcseconds: "arcsec",
2736
+ arcminute: "arcmin",
2737
+ arcminutes: "arcmin",
2738
+ BTUs: "BTU",
2739
+ watts: "watt",
2740
+ joules: "joule",
2741
+ amperes: "ampere",
2742
+ amps: "ampere",
2743
+ amp: "ampere",
2744
+ coulombs: "coulomb",
2745
+ volts: "volt",
2746
+ ohms: "ohm",
2747
+ farads: "farad",
2748
+ webers: "weber",
2749
+ teslas: "tesla",
2750
+ electronvolts: "electronvolt",
2751
+ moles: "mole",
2752
+ bit: "bits",
2753
+ byte: "bytes",
2754
+ calories: "calorie"
2755
+ });
2756
+ var namedCache = /* @__PURE__ */ new Map();
2757
+ function namedExactScale(name2) {
2758
+ const cached = namedCache.get(name2);
2759
+ if (cached !== void 0) return cached;
2760
+ if (!Object.prototype.hasOwnProperty.call(NAMED_SCALES, name2)) return void 0;
2761
+ const scale = readScaleExpression(NAMED_SCALES[name2], namedExactScale);
2762
+ namedCache.set(name2, scale);
2763
+ return scale;
2764
+ }
2765
+ function readUnitScale(expression) {
2766
+ return readScaleExpression(expression, namedExactScale);
2767
+ }
2768
+ function getUnitRow(name2) {
2769
+ const own = Object.prototype.hasOwnProperty;
2770
+ if (own.call(UNIT_ROWS, name2)) return UNIT_ROWS[name2];
2771
+ if (own.call(UNIT_ROW_ALIASES, name2)) return UNIT_ROWS[UNIT_ROW_ALIASES[name2]];
2772
+ return void 0;
2773
+ }
2774
+ function unitRowExactScale(name2) {
2775
+ const row = getUnitRow(name2);
2776
+ return row === void 0 ? void 0 : readUnitScale(row.scale);
2777
+ }
2778
+ function unitRowValue(name2) {
2779
+ const scale = unitRowExactScale(name2);
2780
+ return scale === void 0 ? void 0 : exactScaleToNumber(scale);
2781
+ }
2782
+ function unitRowExactOffset(name2) {
2783
+ const row = getUnitRow(name2);
2784
+ if (row === void 0) return void 0;
2785
+ return row.offset === void 0 ? ratioExactScale(0) : readUnitScale(row.offset);
2786
+ }
2787
+
2151
2788
  // src/types/unit/Unit.ts
2789
+ var UNIT_ZERO_SCALE = ratioExactScale(0);
2790
+ function exactOffsetShift(from, to) {
2791
+ if (from.exact === void 0 || to.exact === void 0) return null;
2792
+ return addExactScales(
2793
+ multiplyExactScales(from.exact, from.exactOffset ?? UNIT_ZERO_SCALE),
2794
+ multiplyExactScales(ratioExactScale(-1), to.exact, to.exactOffset ?? UNIT_ZERO_SCALE)
2795
+ );
2796
+ }
2797
+ function attachExactScale(def, exact, exactOffset) {
2798
+ Object.defineProperty(def, "exact", {
2799
+ value: exact,
2800
+ enumerable: false,
2801
+ writable: true,
2802
+ configurable: true
2803
+ });
2804
+ Object.defineProperty(def, "exactOffset", {
2805
+ value: exactOffset,
2806
+ enumerable: false,
2807
+ writable: true,
2808
+ configurable: true
2809
+ });
2810
+ }
2811
+ var prefixScales = /* @__PURE__ */ new WeakMap();
2812
+ function prefixExactScale(prefix) {
2813
+ let scale = prefixScales.get(prefix);
2814
+ if (scale === void 0) {
2815
+ scale = Number.isFinite(prefix.value) ? exactScaleOf(prefix.value) : null;
2816
+ prefixScales.set(prefix, scale);
2817
+ }
2818
+ return scale;
2819
+ }
2152
2820
  function normalizeDegreeSymbols(s) {
2153
2821
  return s.replace(/°C/g, "degC").replace(/°F/g, "degF").replace(/°/g, "deg");
2154
2822
  }
@@ -2197,6 +2865,70 @@ var createUnitClass = /* @__PURE__ */ factory(
2197
2865
  const toNumber = number2;
2198
2866
  const fixPrefixDefault = false;
2199
2867
  const skipAutomaticSimplificationDefault = true;
2868
+ function bigNumberFromText(text2) {
2869
+ const parse = BigNumber2.parse;
2870
+ return typeof parse === "function" ? parse.call(BigNumber2, text2) : new BigNumber2(text2);
2871
+ }
2872
+ function exactToBigNumber(scale) {
2873
+ let v = bigNumberFromText(scale.num.toString()).div(bigNumberFromText(scale.den.toString()));
2874
+ const pi = BIGNUMBER_PI;
2875
+ for (let k = 0; k < Math.abs(scale.pi); k++) v = scale.pi > 0 ? v.times(pi) : v.div(pi);
2876
+ return v;
2877
+ }
2878
+ function simplestReading(value, scale) {
2879
+ if (value === 0) return void 0;
2880
+ const start = applyExactScale(value, scale, true);
2881
+ if (typeof start !== "number" || !Number.isFinite(start) || start === 0) return void 0;
2882
+ const view = new DataView(new ArrayBuffer(8));
2883
+ view.setFloat64(0, start);
2884
+ const bits = view.getBigInt64(0);
2885
+ let best;
2886
+ let bestLength = Infinity;
2887
+ for (const step of [0n, -1n, 1n, -2n, 2n, -3n, 3n, -4n, 4n]) {
2888
+ view.setBigInt64(0, bits + step);
2889
+ const r = view.getFloat64(0);
2890
+ if (!Number.isFinite(r) || Math.sign(r) !== Math.sign(start)) continue;
2891
+ if (exactScaleToNumber(multiplyExactScales(exactScaleOf(r), scale)) !== value) continue;
2892
+ const length = String(r).length;
2893
+ if (length < bestLength) {
2894
+ best = r;
2895
+ bestLength = length;
2896
+ }
2897
+ }
2898
+ return best;
2899
+ }
2900
+ function addExactShift(unit, value, shift) {
2901
+ if (typeof value === "number") {
2902
+ if (!Number.isFinite(value)) return void 0;
2903
+ let normalized = binaryExactScale(value);
2904
+ const scale = unit.exactScale();
2905
+ const reading = scale === null ? void 0 : simplestReading(value, scale);
2906
+ if (reading !== void 0) normalized = multiplyExactScales(exactScaleOf(reading), scale);
2907
+ const sum = addExactScales(normalized, shift);
2908
+ return sum === null ? void 0 : exactScaleToNumber(sum);
2909
+ }
2910
+ const s = exactAs(shift, typeOf(value));
2911
+ return s === void 0 ? void 0 : addScalar2(value, s);
2912
+ }
2913
+ function exactAs(scale, type) {
2914
+ if (type === "Fraction") {
2915
+ return scale.pi === 0 ? new Fraction2(scale.num, scale.den) : void 0;
2916
+ }
2917
+ if (type === "BigNumber") return exactToBigNumber(scale);
2918
+ return void 0;
2919
+ }
2920
+ function applyExactScale(value, scale, divide) {
2921
+ if (typeof value === "number") {
2922
+ if (!Number.isFinite(value) || value === 0) return void 0;
2923
+ const x = divide ? binaryExactScale(value) : exactScaleOf(value);
2924
+ return exactScaleToNumber(
2925
+ divide ? divideExactScales(x, scale) : multiplyExactScales(x, scale)
2926
+ );
2927
+ }
2928
+ const factor = exactAs(scale, typeOf(value));
2929
+ if (factor === void 0) return void 0;
2930
+ return divide ? divideScalar2(value, factor) : multiplyScalar2(value, factor);
2931
+ }
2200
2932
  const Unit2 = function(value, valuelessUnit) {
2201
2933
  if (!(this instanceof Unit2)) {
2202
2934
  throw new Error("Constructor must be called with the new operator");
@@ -2486,10 +3218,33 @@ var createUnitClass = /* @__PURE__ */ factory(
2486
3218
  }
2487
3219
  return this.units.length > 1 || Math.abs(this.units[0].power - 1) > 1e-15;
2488
3220
  };
3221
+ Unit2.prototype.exactScale = function() {
3222
+ let scale = UNIT_EXACT_SCALE;
3223
+ for (const component of this.units) {
3224
+ const unitScale = component.unit.exact;
3225
+ const prefixScale = prefixExactScale(component.prefix);
3226
+ if (unitScale === void 0 || prefixScale === null || !Number.isInteger(component.power)) {
3227
+ return null;
3228
+ }
3229
+ scale = multiplyExactScales(
3230
+ scale,
3231
+ powerExactScale(multiplyExactScales(unitScale, prefixScale), component.power)
3232
+ );
3233
+ }
3234
+ return scale;
3235
+ };
3236
+ Unit2.exactScale = function(valuelessUnit) {
3237
+ return Unit2.parse(valuelessUnit).exactScale();
3238
+ };
2489
3239
  Unit2.prototype._normalize = function(value) {
2490
3240
  if (value === null || value === void 0 || this.units.length === 0) {
2491
3241
  return value ?? null;
2492
3242
  }
3243
+ const scale = this.exactScale();
3244
+ if (scale !== null) {
3245
+ const exact = applyExactScale(value, scale, false);
3246
+ if (exact !== void 0) return exact;
3247
+ }
2493
3248
  let res = value;
2494
3249
  const convert = Unit2._getNumberConverter(typeOf(value));
2495
3250
  for (let i = 0; i < this.units.length; i++) {
@@ -2504,6 +3259,11 @@ var createUnitClass = /* @__PURE__ */ factory(
2504
3259
  if (value === null || value === void 0 || this.units.length === 0) {
2505
3260
  return value ?? null;
2506
3261
  }
3262
+ const scale = this.exactScale();
3263
+ if (scale !== null) {
3264
+ const exact = applyExactScale(value, scale, true);
3265
+ if (exact !== void 0) return exact;
3266
+ }
2507
3267
  let res = value;
2508
3268
  const convert = Unit2._getNumberConverter(typeOf(value));
2509
3269
  for (let i = 0; i < this.units.length; i++) {
@@ -2726,9 +3486,10 @@ var createUnitClass = /* @__PURE__ */ factory(
2726
3486
  ret.value = abs2(ret.value);
2727
3487
  } else {
2728
3488
  const convert = ret._numberConverter();
2729
- const unitValue = convert(ret.units[0].unit.value);
2730
- const nominalOffset = convert(ret.units[0].unit.offset);
2731
- const unitOffset = multiplyScalar2(unitValue, nominalOffset);
3489
+ const def = ret.units[0].unit;
3490
+ const exactOffset = def.exact === void 0 ? void 0 : multiplyExactScales(def.exact, def.exactOffset ?? UNIT_ZERO_SCALE);
3491
+ const valueType = typeOf(ret.value);
3492
+ const unitOffset = exactOffset === void 0 ? multiplyScalar2(convert(def.value), convert(def.offset)) : valueType === "number" ? exactScaleToNumber(exactOffset) : exactAs(exactOffset, valueType) ?? multiplyScalar2(convert(def.value), convert(def.offset));
2732
3493
  ret.value = subtractScalar3(abs2(addScalar2(ret.value, unitOffset)), unitOffset);
2733
3494
  }
2734
3495
  }
@@ -2761,6 +3522,14 @@ var createUnitClass = /* @__PURE__ */ factory(
2761
3522
  if (this.value === null || this._isDerived() || this.units.length === 0 || other.units.length === 0 || this.units[0].unit.offset === other.units[0].unit.offset) {
2762
3523
  other.value = clone(value);
2763
3524
  } else {
3525
+ const shift = exactOffsetShift(this.units[0].unit, other.units[0].unit);
3526
+ const shifted = shift === null ? void 0 : addExactShift(this, value, shift);
3527
+ if (shifted !== void 0) {
3528
+ other.value = shifted;
3529
+ other.fixPrefix = true;
3530
+ other.skipAutomaticSimplification = true;
3531
+ return other;
3532
+ }
2764
3533
  const convert = Unit2._getNumberConverter(typeOf(value));
2765
3534
  const thisUnitValue = this.units[0].unit.value;
2766
3535
  const thisNominalOffset = this.units[0].unit.offset;
@@ -3092,183 +3861,30 @@ var createUnitClass = /* @__PURE__ */ factory(
3092
3861
  ret.push(x);
3093
3862
  return ret;
3094
3863
  };
3095
- const PREFIXES = {
3096
- NONE: {
3097
- "": { name: "", value: 1, scientific: true }
3098
- },
3099
- SHORT: {
3100
- "": { name: "", value: 1, scientific: true },
3101
- da: { name: "da", value: 10, scientific: false },
3102
- h: { name: "h", value: 100, scientific: false },
3103
- k: { name: "k", value: 1e3, scientific: true },
3104
- M: { name: "M", value: 1e6, scientific: true },
3105
- G: { name: "G", value: 1e9, scientific: true },
3106
- T: { name: "T", value: 1e12, scientific: true },
3107
- P: { name: "P", value: 1e15, scientific: true },
3108
- E: { name: "E", value: 1e18, scientific: true },
3109
- Z: { name: "Z", value: 1e21, scientific: true },
3110
- Y: { name: "Y", value: 1e24, scientific: true },
3111
- R: { name: "R", value: 1e27, scientific: true },
3112
- Q: { name: "Q", value: 1e30, scientific: true },
3113
- d: { name: "d", value: 0.1, scientific: false },
3114
- c: { name: "c", value: 0.01, scientific: false },
3115
- m: { name: "m", value: 1e-3, scientific: true },
3116
- u: { name: "u", value: 1e-6, scientific: true },
3117
- n: { name: "n", value: 1e-9, scientific: true },
3118
- p: { name: "p", value: 1e-12, scientific: true },
3119
- f: { name: "f", value: 1e-15, scientific: true },
3120
- a: { name: "a", value: 1e-18, scientific: true },
3121
- z: { name: "z", value: 1e-21, scientific: true },
3122
- y: { name: "y", value: 1e-24, scientific: true },
3123
- r: { name: "r", value: 1e-27, scientific: true },
3124
- q: { name: "q", value: 1e-30, scientific: true }
3125
- },
3126
- LONG: {
3127
- "": { name: "", value: 1, scientific: true },
3128
- deca: { name: "deca", value: 10, scientific: false },
3129
- hecto: { name: "hecto", value: 100, scientific: false },
3130
- kilo: { name: "kilo", value: 1e3, scientific: true },
3131
- mega: { name: "mega", value: 1e6, scientific: true },
3132
- giga: { name: "giga", value: 1e9, scientific: true },
3133
- tera: { name: "tera", value: 1e12, scientific: true },
3134
- peta: { name: "peta", value: 1e15, scientific: true },
3135
- exa: { name: "exa", value: 1e18, scientific: true },
3136
- zetta: { name: "zetta", value: 1e21, scientific: true },
3137
- yotta: { name: "yotta", value: 1e24, scientific: true },
3138
- ronna: { name: "ronna", value: 1e27, scientific: true },
3139
- quetta: { name: "quetta", value: 1e30, scientific: true },
3140
- deci: { name: "deci", value: 0.1, scientific: false },
3141
- centi: { name: "centi", value: 0.01, scientific: false },
3142
- milli: { name: "milli", value: 1e-3, scientific: true },
3143
- micro: { name: "micro", value: 1e-6, scientific: true },
3144
- nano: { name: "nano", value: 1e-9, scientific: true },
3145
- pico: { name: "pico", value: 1e-12, scientific: true },
3146
- femto: { name: "femto", value: 1e-15, scientific: true },
3147
- atto: { name: "atto", value: 1e-18, scientific: true },
3148
- zepto: { name: "zepto", value: 1e-21, scientific: true },
3149
- yocto: { name: "yocto", value: 1e-24, scientific: true },
3150
- ronto: { name: "ronto", value: 1e-27, scientific: true },
3151
- quecto: { name: "quecto", value: 1e-30, scientific: true }
3152
- },
3153
- SQUARED: {
3154
- "": { name: "", value: 1, scientific: true },
3155
- da: { name: "da", value: 100, scientific: false },
3156
- h: { name: "h", value: 1e4, scientific: false },
3157
- k: { name: "k", value: 1e6, scientific: true },
3158
- M: { name: "M", value: 1e12, scientific: true },
3159
- G: { name: "G", value: 1e18, scientific: true },
3160
- T: { name: "T", value: 1e24, scientific: true },
3161
- P: { name: "P", value: 1e30, scientific: true },
3162
- E: { name: "E", value: 1e36, scientific: true },
3163
- Z: { name: "Z", value: 1e42, scientific: true },
3164
- Y: { name: "Y", value: 1e48, scientific: true },
3165
- R: { name: "R", value: 1e54, scientific: true },
3166
- Q: { name: "Q", value: 1e60, scientific: true },
3167
- d: { name: "d", value: 0.01, scientific: false },
3168
- c: { name: "c", value: 1e-4, scientific: false },
3169
- m: { name: "m", value: 1e-6, scientific: true },
3170
- u: { name: "u", value: 1e-12, scientific: true },
3171
- n: { name: "n", value: 1e-18, scientific: true },
3172
- p: { name: "p", value: 1e-24, scientific: true },
3173
- f: { name: "f", value: 1e-30, scientific: true },
3174
- a: { name: "a", value: 1e-36, scientific: true },
3175
- z: { name: "z", value: 1e-42, scientific: true },
3176
- y: { name: "y", value: 1e-48, scientific: true },
3177
- r: { name: "r", value: 1e-54, scientific: true },
3178
- q: { name: "q", value: 1e-60, scientific: true }
3179
- },
3180
- CUBIC: {
3181
- "": { name: "", value: 1, scientific: true },
3182
- da: { name: "da", value: 1e3, scientific: false },
3183
- h: { name: "h", value: 1e6, scientific: false },
3184
- k: { name: "k", value: 1e9, scientific: true },
3185
- M: { name: "M", value: 1e18, scientific: true },
3186
- G: { name: "G", value: 1e27, scientific: true },
3187
- T: { name: "T", value: 1e36, scientific: true },
3188
- P: { name: "P", value: 1e45, scientific: true },
3189
- E: { name: "E", value: 1e54, scientific: true },
3190
- Z: { name: "Z", value: 1e63, scientific: true },
3191
- Y: { name: "Y", value: 1e72, scientific: true },
3192
- R: { name: "R", value: 1e81, scientific: true },
3193
- Q: { name: "Q", value: 1e90, scientific: true },
3194
- d: { name: "d", value: 1e-3, scientific: false },
3195
- c: { name: "c", value: 1e-6, scientific: false },
3196
- m: { name: "m", value: 1e-9, scientific: true },
3197
- u: { name: "u", value: 1e-18, scientific: true },
3198
- n: { name: "n", value: 1e-27, scientific: true },
3199
- p: { name: "p", value: 1e-36, scientific: true },
3200
- f: { name: "f", value: 1e-45, scientific: true },
3201
- a: { name: "a", value: 1e-54, scientific: true },
3202
- z: { name: "z", value: 1e-63, scientific: true },
3203
- y: { name: "y", value: 1e-72, scientific: true },
3204
- r: { name: "r", value: 1e-81, scientific: true },
3205
- q: { name: "q", value: 1e-90, scientific: true }
3206
- },
3207
- BINARY_SHORT_SI: {
3208
- "": { name: "", value: 1, scientific: true },
3209
- k: { name: "k", value: 1e3, scientific: true },
3210
- M: { name: "M", value: 1e6, scientific: true },
3211
- G: { name: "G", value: 1e9, scientific: true },
3212
- T: { name: "T", value: 1e12, scientific: true },
3213
- P: { name: "P", value: 1e15, scientific: true },
3214
- E: { name: "E", value: 1e18, scientific: true },
3215
- Z: { name: "Z", value: 1e21, scientific: true },
3216
- Y: { name: "Y", value: 1e24, scientific: true }
3217
- },
3218
- BINARY_SHORT_IEC: {
3219
- "": { name: "", value: 1, scientific: true },
3220
- Ki: { name: "Ki", value: 1024, scientific: true },
3221
- Mi: { name: "Mi", value: Math.pow(1024, 2), scientific: true },
3222
- Gi: { name: "Gi", value: Math.pow(1024, 3), scientific: true },
3223
- Ti: { name: "Ti", value: Math.pow(1024, 4), scientific: true },
3224
- Pi: { name: "Pi", value: Math.pow(1024, 5), scientific: true },
3225
- Ei: { name: "Ei", value: Math.pow(1024, 6), scientific: true },
3226
- Zi: { name: "Zi", value: Math.pow(1024, 7), scientific: true },
3227
- Yi: { name: "Yi", value: Math.pow(1024, 8), scientific: true }
3228
- },
3229
- BINARY_LONG_SI: {
3230
- "": { name: "", value: 1, scientific: true },
3231
- kilo: { name: "kilo", value: 1e3, scientific: true },
3232
- mega: { name: "mega", value: 1e6, scientific: true },
3233
- giga: { name: "giga", value: 1e9, scientific: true },
3234
- tera: { name: "tera", value: 1e12, scientific: true },
3235
- peta: { name: "peta", value: 1e15, scientific: true },
3236
- exa: { name: "exa", value: 1e18, scientific: true },
3237
- zetta: { name: "zetta", value: 1e21, scientific: true },
3238
- yotta: { name: "yotta", value: 1e24, scientific: true }
3239
- },
3240
- BINARY_LONG_IEC: {
3241
- "": { name: "", value: 1, scientific: true },
3242
- kibi: { name: "kibi", value: 1024, scientific: true },
3243
- mebi: { name: "mebi", value: Math.pow(1024, 2), scientific: true },
3244
- gibi: { name: "gibi", value: Math.pow(1024, 3), scientific: true },
3245
- tebi: { name: "tebi", value: Math.pow(1024, 4), scientific: true },
3246
- pebi: { name: "pebi", value: Math.pow(1024, 5), scientific: true },
3247
- exi: { name: "exi", value: Math.pow(1024, 6), scientific: true },
3248
- zebi: { name: "zebi", value: Math.pow(1024, 7), scientific: true },
3249
- yobi: { name: "yobi", value: Math.pow(1024, 8), scientific: true }
3250
- },
3251
- BTU: {
3252
- "": { name: "", value: 1, scientific: true },
3253
- MM: { name: "MM", value: 1e6, scientific: true }
3864
+ const PREFIXES = {};
3865
+ const prefixTable = (set2, keep = () => true) => {
3866
+ const table = {};
3867
+ for (const name2 of Object.keys(set2)) {
3868
+ const prefix = set2[name2];
3869
+ if (name2 !== "" && !keep(prefix, name2)) continue;
3870
+ const exact = unitPrefixExactScale(prefix);
3871
+ const def = {
3872
+ name: name2,
3873
+ value: exactScaleToNumber(exact),
3874
+ scientific: prefix.scientific
3875
+ };
3876
+ prefixScales.set(def, exact);
3877
+ table[name2] = def;
3254
3878
  }
3879
+ return table;
3255
3880
  };
3256
- PREFIXES.SHORTLONG = Object.assign({}, PREFIXES.SHORT, PREFIXES.LONG);
3257
- PREFIXES.BINARY_SHORT = Object.assign({}, PREFIXES.BINARY_SHORT_SI, PREFIXES.BINARY_SHORT_IEC);
3258
- PREFIXES.BINARY_LONG = Object.assign({}, PREFIXES.BINARY_LONG_SI, PREFIXES.BINARY_LONG_IEC);
3259
- PREFIXES.SHORT_UP_ONLY = {
3260
- "": { name: "", value: 1, scientific: true },
3261
- k: { name: "k", value: 1e3, scientific: true },
3262
- M: { name: "M", value: 1e6, scientific: true },
3263
- G: { name: "G", value: 1e9, scientific: true },
3264
- T: { name: "T", value: 1e12, scientific: true },
3265
- P: { name: "P", value: 1e15, scientific: true },
3266
- E: { name: "E", value: 1e18, scientific: true },
3267
- Z: { name: "Z", value: 1e21, scientific: true },
3268
- Y: { name: "Y", value: 1e24, scientific: true },
3269
- R: { name: "R", value: 1e27, scientific: true },
3270
- Q: { name: "Q", value: 1e30, scientific: true }
3271
- };
3881
+ for (const key of Object.keys(UNIT_PREFIX_SETS)) {
3882
+ PREFIXES[key] = prefixTable(UNIT_PREFIX_SETS[key]);
3883
+ }
3884
+ PREFIXES.BINARY_SHORT_SI = prefixTable(UNIT_PREFIX_SETS.BINARY_SHORT, (p) => p.radix === 10);
3885
+ PREFIXES.BINARY_SHORT_IEC = prefixTable(UNIT_PREFIX_SETS.BINARY_SHORT, (p) => p.radix === 1024);
3886
+ PREFIXES.BINARY_LONG_SI = prefixTable(UNIT_PREFIX_SETS.BINARY_LONG, (p) => p.radix === 10);
3887
+ PREFIXES.BINARY_LONG_IEC = prefixTable(UNIT_PREFIX_SETS.BINARY_LONG, (p) => p.radix === 1024);
3272
3888
  const BASE_DIMENSIONS = [
3273
3889
  "MASS",
3274
3890
  "LENGTH",
@@ -3374,1410 +3990,35 @@ var createUnitClass = /* @__PURE__ */ factory(
3374
3990
  offset: 0,
3375
3991
  dimensions: BASE_DIMENSIONS.map((_x) => 0)
3376
3992
  };
3377
- const UNITS = {
3378
- // length
3379
- meter: {
3380
- name: "meter",
3381
- base: BASE_UNITS.LENGTH,
3382
- prefixes: PREFIXES.LONG,
3383
- value: 1,
3384
- offset: 0
3385
- },
3386
- inch: {
3387
- name: "inch",
3388
- base: BASE_UNITS.LENGTH,
3389
- prefixes: PREFIXES.NONE,
3390
- value: 0.0254,
3391
- offset: 0
3392
- },
3393
- foot: {
3394
- name: "foot",
3395
- base: BASE_UNITS.LENGTH,
3396
- prefixes: PREFIXES.NONE,
3397
- value: 0.3048,
3398
- offset: 0
3399
- },
3400
- yard: {
3401
- name: "yard",
3402
- base: BASE_UNITS.LENGTH,
3403
- prefixes: PREFIXES.NONE,
3404
- value: 0.9144,
3405
- offset: 0
3406
- },
3407
- mile: {
3408
- name: "mile",
3409
- base: BASE_UNITS.LENGTH,
3410
- prefixes: PREFIXES.NONE,
3411
- value: 1609.344,
3412
- offset: 0
3413
- },
3414
- link: {
3415
- name: "link",
3416
- base: BASE_UNITS.LENGTH,
3417
- prefixes: PREFIXES.NONE,
3418
- value: 0.201168,
3419
- offset: 0
3420
- },
3421
- rod: {
3422
- name: "rod",
3423
- base: BASE_UNITS.LENGTH,
3424
- prefixes: PREFIXES.NONE,
3425
- value: 5.0292,
3426
- offset: 0
3427
- },
3428
- chain: {
3429
- name: "chain",
3430
- base: BASE_UNITS.LENGTH,
3431
- prefixes: PREFIXES.NONE,
3432
- value: 20.1168,
3433
- offset: 0
3434
- },
3435
- angstrom: {
3436
- name: "angstrom",
3437
- base: BASE_UNITS.LENGTH,
3438
- prefixes: PREFIXES.NONE,
3439
- value: 1e-10,
3440
- offset: 0
3441
- },
3442
- // Astronomical / nautical / typography length units (ported from
3443
- // upstream mathjs ece1aab0f + 5f360326b — B-5). `ly` and `pc` are
3444
- // first-class UNITS with SHORT_UP_ONLY prefixes so kpc/Mpc/Mly/Gly
3445
- // resolve through the prefix system while sub-multiples throw.
3446
- astronomicalUnit: {
3447
- name: "astronomicalUnit",
3448
- base: BASE_UNITS.LENGTH,
3449
- prefixes: PREFIXES.NONE,
3450
- value: 149597870700,
3451
- // IAU 2012 exact definition
3452
- offset: 0
3453
- },
3454
- lightyear: {
3455
- name: "lightyear",
3456
- base: BASE_UNITS.LENGTH,
3457
- prefixes: PREFIXES.NONE,
3458
- value: 9460730472580800,
3459
- // Julian year × c (exact)
3460
- offset: 0
3461
- },
3462
- ly: {
3463
- name: "ly",
3464
- base: BASE_UNITS.LENGTH,
3465
- prefixes: PREFIXES.SHORT_UP_ONLY,
3466
- value: 9460730472580800,
3467
- offset: 0
3468
- },
3469
- parsec: {
3470
- name: "parsec",
3471
- base: BASE_UNITS.LENGTH,
3472
- prefixes: PREFIXES.LONG,
3473
- // kiloparsec, megaparsec, gigaparsec
3474
- value: 30856775814913700,
3475
- // IAU 2015 exact definition
3476
- offset: 0
3477
- },
3478
- pc: {
3479
- name: "pc",
3480
- base: BASE_UNITS.LENGTH,
3481
- prefixes: PREFIXES.SHORT_UP_ONLY,
3482
- value: 30856775814913700,
3483
- offset: 0
3484
- },
3485
- nauticalMile: {
3486
- name: "nauticalMile",
3487
- base: BASE_UNITS.LENGTH,
3488
- prefixes: PREFIXES.NONE,
3489
- value: 1852,
3490
- // exact
3491
- offset: 0
3492
- },
3493
- fathom: {
3494
- name: "fathom",
3495
- base: BASE_UNITS.LENGTH,
3496
- prefixes: PREFIXES.NONE,
3497
- value: 1.8288,
3498
- // 6 ft exactly
3499
- offset: 0
3500
- },
3501
- furlong: {
3502
- name: "furlong",
3503
- base: BASE_UNITS.LENGTH,
3504
- prefixes: PREFIXES.NONE,
3505
- value: 201.168,
3506
- // 1/8 mile exactly
3507
- offset: 0
3508
- },
3509
- point: {
3510
- name: "point",
3511
- base: BASE_UNITS.LENGTH,
3512
- prefixes: PREFIXES.NONE,
3513
- value: 0.0254 / 72,
3514
- // 1/72 inch (PostScript), exact
3515
- offset: 0
3516
- },
3517
- pica: {
3518
- name: "pica",
3519
- base: BASE_UNITS.LENGTH,
3520
- prefixes: PREFIXES.NONE,
3521
- value: 0.0254 / 6,
3522
- // 1/6 inch (12 points), exact
3523
- offset: 0
3524
- },
3525
- m: {
3526
- name: "m",
3527
- base: BASE_UNITS.LENGTH,
3528
- prefixes: PREFIXES.SHORT,
3529
- value: 1,
3530
- offset: 0
3531
- },
3532
- in: {
3533
- name: "in",
3534
- base: BASE_UNITS.LENGTH,
3535
- prefixes: PREFIXES.NONE,
3536
- value: 0.0254,
3537
- offset: 0
3538
- },
3539
- ft: {
3540
- name: "ft",
3541
- base: BASE_UNITS.LENGTH,
3542
- prefixes: PREFIXES.NONE,
3543
- value: 0.3048,
3544
- offset: 0
3545
- },
3546
- yd: {
3547
- name: "yd",
3548
- base: BASE_UNITS.LENGTH,
3549
- prefixes: PREFIXES.NONE,
3550
- value: 0.9144,
3551
- offset: 0
3552
- },
3553
- mi: {
3554
- name: "mi",
3555
- base: BASE_UNITS.LENGTH,
3556
- prefixes: PREFIXES.NONE,
3557
- value: 1609.344,
3558
- offset: 0
3559
- },
3560
- li: {
3561
- name: "li",
3562
- base: BASE_UNITS.LENGTH,
3563
- prefixes: PREFIXES.NONE,
3564
- value: 0.201168,
3565
- offset: 0
3566
- },
3567
- rd: {
3568
- name: "rd",
3569
- base: BASE_UNITS.LENGTH,
3570
- prefixes: PREFIXES.NONE,
3571
- value: 5.02921,
3572
- offset: 0
3573
- },
3574
- ch: {
3575
- name: "ch",
3576
- base: BASE_UNITS.LENGTH,
3577
- prefixes: PREFIXES.NONE,
3578
- value: 20.1168,
3579
- offset: 0
3580
- },
3581
- mil: {
3582
- name: "mil",
3583
- base: BASE_UNITS.LENGTH,
3584
- prefixes: PREFIXES.NONE,
3585
- value: 254e-7,
3586
- offset: 0
3587
- },
3588
- // 1/1000 inch
3589
- // Surface
3590
- m2: {
3591
- name: "m2",
3592
- base: BASE_UNITS.SURFACE,
3593
- prefixes: PREFIXES.SQUARED,
3594
- value: 1,
3595
- offset: 0
3596
- },
3597
- sqin: {
3598
- name: "sqin",
3599
- base: BASE_UNITS.SURFACE,
3600
- prefixes: PREFIXES.NONE,
3601
- value: 64516e-8,
3602
- offset: 0
3603
- },
3604
- // 645.16 mm2
3605
- sqft: {
3606
- name: "sqft",
3607
- base: BASE_UNITS.SURFACE,
3608
- prefixes: PREFIXES.NONE,
3609
- value: 0.09290304,
3610
- offset: 0
3611
- },
3612
- // 0.09290304 m2
3613
- sqyd: {
3614
- name: "sqyd",
3615
- base: BASE_UNITS.SURFACE,
3616
- prefixes: PREFIXES.NONE,
3617
- value: 0.83612736,
3618
- offset: 0
3619
- },
3620
- // 0.83612736 m2
3621
- sqmi: {
3622
- name: "sqmi",
3623
- base: BASE_UNITS.SURFACE,
3624
- prefixes: PREFIXES.NONE,
3625
- value: 2589988110336e-6,
3626
- offset: 0
3627
- },
3628
- // 2.589988110336 km2
3629
- sqrd: {
3630
- name: "sqrd",
3631
- base: BASE_UNITS.SURFACE,
3632
- prefixes: PREFIXES.NONE,
3633
- value: 25.29295,
3634
- offset: 0
3635
- },
3636
- // 25.29295 m2
3637
- sqch: {
3638
- name: "sqch",
3639
- base: BASE_UNITS.SURFACE,
3640
- prefixes: PREFIXES.NONE,
3641
- value: 404.6873,
3642
- offset: 0
3643
- },
3644
- // 404.6873 m2
3645
- sqmil: {
3646
- name: "sqmil",
3647
- base: BASE_UNITS.SURFACE,
3648
- prefixes: PREFIXES.NONE,
3649
- value: 64516e-14,
3650
- offset: 0
3651
- },
3652
- // 6.4516 * 10^-10 m2
3653
- acre: {
3654
- name: "acre",
3655
- base: BASE_UNITS.SURFACE,
3656
- prefixes: PREFIXES.NONE,
3657
- value: 4046.86,
3658
- offset: 0
3659
- },
3660
- // 4046.86 m2
3661
- hectare: {
3662
- name: "hectare",
3663
- base: BASE_UNITS.SURFACE,
3664
- prefixes: PREFIXES.NONE,
3665
- value: 1e4,
3666
- offset: 0
3667
- },
3668
- // 10000 m2
3669
- // Volume
3670
- m3: {
3671
- name: "m3",
3672
- base: BASE_UNITS.VOLUME,
3673
- prefixes: PREFIXES.CUBIC,
3674
- value: 1,
3675
- offset: 0
3676
- },
3677
- L: {
3678
- name: "L",
3679
- base: BASE_UNITS.VOLUME,
3680
- prefixes: PREFIXES.SHORT,
3681
- value: 1e-3,
3682
- offset: 0
3683
- },
3684
- // litre
3685
- l: {
3686
- name: "l",
3687
- base: BASE_UNITS.VOLUME,
3688
- prefixes: PREFIXES.SHORT,
3689
- value: 1e-3,
3690
- offset: 0
3691
- },
3692
- // litre
3693
- litre: {
3694
- name: "litre",
3695
- base: BASE_UNITS.VOLUME,
3696
- prefixes: PREFIXES.LONG,
3697
- value: 1e-3,
3698
- offset: 0
3699
- },
3700
- cuin: {
3701
- name: "cuin",
3702
- base: BASE_UNITS.VOLUME,
3703
- prefixes: PREFIXES.NONE,
3704
- value: 16387064e-12,
3705
- offset: 0
3706
- },
3707
- // 1.6387064e-5 m3
3708
- cuft: {
3709
- name: "cuft",
3710
- base: BASE_UNITS.VOLUME,
3711
- prefixes: PREFIXES.NONE,
3712
- value: 0.028316846592,
3713
- offset: 0
3714
- },
3715
- // 28.316 846 592 L
3716
- cuyd: {
3717
- name: "cuyd",
3718
- base: BASE_UNITS.VOLUME,
3719
- prefixes: PREFIXES.NONE,
3720
- value: 0.764554857984,
3721
- offset: 0
3722
- },
3723
- // 764.554 857 984 L
3724
- teaspoon: {
3725
- name: "teaspoon",
3726
- base: BASE_UNITS.VOLUME,
3727
- prefixes: PREFIXES.NONE,
3728
- value: 5e-6,
3729
- offset: 0
3730
- },
3731
- // 5 mL
3732
- tablespoon: {
3733
- name: "tablespoon",
3734
- base: BASE_UNITS.VOLUME,
3735
- prefixes: PREFIXES.NONE,
3736
- value: 15e-6,
3737
- offset: 0
3738
- },
3739
- // 15 mL
3740
- // {name: 'cup', base: BASE_UNITS.VOLUME, prefixes: PREFIXES.NONE, value: 0.000240, offset: 0}, // 240 mL // not possible, we have already another cup
3741
- drop: {
3742
- name: "drop",
3743
- base: BASE_UNITS.VOLUME,
3744
- prefixes: PREFIXES.NONE,
3745
- value: 5e-8,
3746
- offset: 0
3747
- },
3748
- // 0.05 mL = 5e-8 m3
3749
- gtt: {
3750
- name: "gtt",
3751
- base: BASE_UNITS.VOLUME,
3752
- prefixes: PREFIXES.NONE,
3753
- value: 5e-8,
3754
- offset: 0
3755
- },
3756
- // 0.05 mL = 5e-8 m3
3757
- // Liquid volume
3758
- minim: {
3759
- name: "minim",
3760
- base: BASE_UNITS.VOLUME,
3761
- prefixes: PREFIXES.NONE,
3762
- value: 61611519921875e-21,
3763
- offset: 0
3764
- },
3765
- // 1/61440 gallons
3766
- fluiddram: {
3767
- name: "fluiddram",
3768
- base: BASE_UNITS.VOLUME,
3769
- prefixes: PREFIXES.NONE,
3770
- value: 36966911953125e-19,
3771
- offset: 0
3772
- },
3773
- // 1/1024 gallons
3774
- fluidounce: {
3775
- name: "fluidounce",
3776
- base: BASE_UNITS.VOLUME,
3777
- prefixes: PREFIXES.NONE,
3778
- value: 295735295625e-16,
3779
- offset: 0
3780
- },
3781
- // 1/128 gallons
3782
- gill: {
3783
- name: "gill",
3784
- base: BASE_UNITS.VOLUME,
3785
- prefixes: PREFIXES.NONE,
3786
- value: 11829411825e-14,
3787
- offset: 0
3788
- },
3789
- // 1/32 gallons
3790
- cc: {
3791
- name: "cc",
3792
- base: BASE_UNITS.VOLUME,
3793
- prefixes: PREFIXES.NONE,
3794
- value: 1e-6,
3795
- offset: 0
3796
- },
3797
- // 1e-6 L
3798
- cup: {
3799
- name: "cup",
3800
- base: BASE_UNITS.VOLUME,
3801
- prefixes: PREFIXES.NONE,
3802
- value: 2365882365e-13,
3803
- offset: 0
3804
- },
3805
- // 1/16 gallons
3806
- pint: {
3807
- name: "pint",
3808
- base: BASE_UNITS.VOLUME,
3809
- prefixes: PREFIXES.NONE,
3810
- value: 473176473e-12,
3811
- offset: 0
3812
- },
3813
- // 1/8 gallons
3814
- quart: {
3815
- name: "quart",
3816
- base: BASE_UNITS.VOLUME,
3817
- prefixes: PREFIXES.NONE,
3818
- value: 946352946e-12,
3819
- offset: 0
3820
- },
3821
- // 1/4 gallons
3822
- gallon: {
3823
- name: "gallon",
3824
- base: BASE_UNITS.VOLUME,
3825
- prefixes: PREFIXES.NONE,
3826
- value: 0.003785411784,
3827
- offset: 0
3828
- },
3829
- // 3.785411784 L
3830
- beerbarrel: {
3831
- name: "beerbarrel",
3832
- base: BASE_UNITS.VOLUME,
3833
- prefixes: PREFIXES.NONE,
3834
- value: 0.117347765304,
3835
- offset: 0
3836
- },
3837
- // 31 gallons
3838
- oilbarrel: {
3839
- name: "oilbarrel",
3840
- base: BASE_UNITS.VOLUME,
3841
- prefixes: PREFIXES.NONE,
3842
- value: 0.158987294928,
3843
- offset: 0
3844
- },
3845
- // 42 gallons
3846
- hogshead: {
3847
- name: "hogshead",
3848
- base: BASE_UNITS.VOLUME,
3849
- prefixes: PREFIXES.NONE,
3850
- value: 0.238480942392,
3851
- offset: 0
3852
- },
3853
- // 63 gallons
3854
- // Mass
3855
- g: {
3856
- name: "g",
3857
- base: BASE_UNITS.MASS,
3858
- prefixes: PREFIXES.SHORT,
3859
- value: 1e-3,
3860
- offset: 0
3861
- },
3862
- gram: {
3863
- name: "gram",
3864
- base: BASE_UNITS.MASS,
3865
- prefixes: PREFIXES.LONG,
3866
- value: 1e-3,
3867
- offset: 0
3868
- },
3869
- ton: {
3870
- name: "ton",
3871
- base: BASE_UNITS.MASS,
3872
- prefixes: PREFIXES.SHORT,
3873
- value: 907.18474,
3874
- offset: 0
3875
- },
3876
- t: {
3877
- name: "t",
3878
- base: BASE_UNITS.MASS,
3879
- prefixes: PREFIXES.SHORT,
3880
- value: 1e3,
3881
- offset: 0
3882
- },
3883
- tonne: {
3884
- name: "tonne",
3885
- base: BASE_UNITS.MASS,
3886
- prefixes: PREFIXES.LONG,
3887
- value: 1e3,
3888
- offset: 0
3889
- },
3890
- grain: {
3891
- name: "grain",
3892
- base: BASE_UNITS.MASS,
3893
- prefixes: PREFIXES.NONE,
3894
- value: 6479891e-11,
3895
- offset: 0
3896
- },
3897
- dram: {
3898
- name: "dram",
3899
- base: BASE_UNITS.MASS,
3900
- prefixes: PREFIXES.NONE,
3901
- value: 0.0017718451953125,
3902
- offset: 0
3903
- },
3904
- ounce: {
3905
- name: "ounce",
3906
- base: BASE_UNITS.MASS,
3907
- prefixes: PREFIXES.NONE,
3908
- value: 0.028349523125,
3909
- offset: 0
3910
- },
3911
- poundmass: {
3912
- name: "poundmass",
3913
- base: BASE_UNITS.MASS,
3914
- prefixes: PREFIXES.NONE,
3915
- value: 0.45359237,
3916
- offset: 0
3917
- },
3918
- hundredweight: {
3919
- name: "hundredweight",
3920
- base: BASE_UNITS.MASS,
3921
- prefixes: PREFIXES.NONE,
3922
- value: 45.359237,
3923
- offset: 0
3924
- },
3925
- stick: {
3926
- name: "stick",
3927
- base: BASE_UNITS.MASS,
3928
- prefixes: PREFIXES.NONE,
3929
- value: 0.115,
3930
- offset: 0
3931
- },
3932
- stone: {
3933
- name: "stone",
3934
- base: BASE_UNITS.MASS,
3935
- prefixes: PREFIXES.NONE,
3936
- value: 6.35029318,
3937
- offset: 0
3938
- },
3939
- gr: {
3940
- name: "gr",
3941
- base: BASE_UNITS.MASS,
3942
- prefixes: PREFIXES.NONE,
3943
- value: 6479891e-11,
3944
- offset: 0
3945
- },
3946
- dr: {
3947
- name: "dr",
3948
- base: BASE_UNITS.MASS,
3949
- prefixes: PREFIXES.NONE,
3950
- value: 0.0017718451953125,
3951
- offset: 0
3952
- },
3953
- oz: {
3954
- name: "oz",
3955
- base: BASE_UNITS.MASS,
3956
- prefixes: PREFIXES.NONE,
3957
- value: 0.028349523125,
3958
- offset: 0
3959
- },
3960
- lbm: {
3961
- name: "lbm",
3962
- base: BASE_UNITS.MASS,
3963
- prefixes: PREFIXES.NONE,
3964
- value: 0.45359237,
3965
- offset: 0
3966
- },
3967
- cwt: {
3968
- name: "cwt",
3969
- base: BASE_UNITS.MASS,
3970
- prefixes: PREFIXES.NONE,
3971
- value: 45.359237,
3972
- offset: 0
3973
- },
3974
- // Time
3975
- s: {
3976
- name: "s",
3977
- base: BASE_UNITS.TIME,
3978
- prefixes: PREFIXES.SHORT,
3979
- value: 1,
3980
- offset: 0
3981
- },
3982
- min: {
3983
- name: "min",
3984
- base: BASE_UNITS.TIME,
3985
- prefixes: PREFIXES.NONE,
3986
- value: 60,
3987
- offset: 0
3988
- },
3989
- h: {
3990
- name: "h",
3991
- base: BASE_UNITS.TIME,
3992
- prefixes: PREFIXES.NONE,
3993
- value: 3600,
3994
- offset: 0
3995
- },
3996
- second: {
3997
- name: "second",
3998
- base: BASE_UNITS.TIME,
3999
- prefixes: PREFIXES.LONG,
4000
- value: 1,
4001
- offset: 0
4002
- },
4003
- sec: {
4004
- name: "sec",
4005
- base: BASE_UNITS.TIME,
4006
- prefixes: PREFIXES.LONG,
4007
- value: 1,
4008
- offset: 0
4009
- },
4010
- minute: {
4011
- name: "minute",
4012
- base: BASE_UNITS.TIME,
4013
- prefixes: PREFIXES.NONE,
4014
- value: 60,
4015
- offset: 0
4016
- },
4017
- hour: {
4018
- name: "hour",
4019
- base: BASE_UNITS.TIME,
4020
- prefixes: PREFIXES.NONE,
4021
- value: 3600,
4022
- offset: 0
4023
- },
4024
- day: {
4025
- name: "day",
4026
- base: BASE_UNITS.TIME,
4027
- prefixes: PREFIXES.NONE,
4028
- value: 86400,
4029
- offset: 0
4030
- },
4031
- week: {
4032
- name: "week",
4033
- base: BASE_UNITS.TIME,
4034
- prefixes: PREFIXES.NONE,
4035
- value: 7 * 86400,
4036
- offset: 0
4037
- },
4038
- month: {
4039
- name: "month",
4040
- base: BASE_UNITS.TIME,
4041
- prefixes: PREFIXES.NONE,
4042
- value: 2629800,
4043
- // 1/12th of Julian year
4044
- offset: 0
4045
- },
4046
- year: {
4047
- name: "year",
4048
- base: BASE_UNITS.TIME,
4049
- prefixes: PREFIXES.NONE,
4050
- value: 31557600,
4051
- // Julian year
4052
- offset: 0
4053
- },
4054
- decade: {
4055
- name: "decade",
4056
- base: BASE_UNITS.TIME,
4057
- prefixes: PREFIXES.NONE,
4058
- value: 315576e3,
4059
- // Julian decade
4060
- offset: 0
4061
- },
4062
- century: {
4063
- name: "century",
4064
- base: BASE_UNITS.TIME,
4065
- prefixes: PREFIXES.NONE,
4066
- value: 315576e4,
4067
- // Julian century
4068
- offset: 0
4069
- },
4070
- millennium: {
4071
- name: "millennium",
4072
- base: BASE_UNITS.TIME,
4073
- prefixes: PREFIXES.NONE,
4074
- value: 315576e5,
4075
- // Julian millennium
4076
- offset: 0
4077
- },
4078
- // Frequency
4079
- hertz: {
4080
- name: "Hertz",
4081
- base: BASE_UNITS.FREQUENCY,
4082
- prefixes: PREFIXES.LONG,
4083
- value: 1,
4084
- offset: 0,
4085
- reciprocal: true
4086
- },
4087
- Hz: {
4088
- name: "Hz",
4089
- base: BASE_UNITS.FREQUENCY,
4090
- prefixes: PREFIXES.SHORT,
4091
- value: 1,
4092
- offset: 0,
4093
- reciprocal: true
4094
- },
4095
- // Angle
4096
- rad: {
4097
- name: "rad",
4098
- base: BASE_UNITS.ANGLE,
4099
- prefixes: PREFIXES.SHORT,
4100
- value: 1,
4101
- offset: 0
4102
- },
4103
- radian: {
4104
- name: "radian",
4105
- base: BASE_UNITS.ANGLE,
4106
- prefixes: PREFIXES.LONG,
4107
- value: 1,
4108
- offset: 0
4109
- },
4110
- // deg = rad / (2*pi) * 360 = rad / 0.017453292519943295769236907684888
4111
- deg: {
4112
- name: "deg",
4113
- base: BASE_UNITS.ANGLE,
4114
- prefixes: PREFIXES.SHORT,
4115
- value: null,
4116
- // will be filled in by calculateAngleValues()
4117
- offset: 0
4118
- },
4119
- degree: {
4120
- name: "degree",
4121
- base: BASE_UNITS.ANGLE,
4122
- prefixes: PREFIXES.LONG,
4123
- value: null,
4124
- // will be filled in by calculateAngleValues()
4125
- offset: 0
4126
- },
4127
- // grad = rad / (2*pi) * 400 = rad / 0.015707963267948966192313216916399
4128
- grad: {
4129
- name: "grad",
4130
- base: BASE_UNITS.ANGLE,
4131
- prefixes: PREFIXES.SHORT,
4132
- value: null,
4133
- // will be filled in by calculateAngleValues()
4134
- offset: 0
4135
- },
4136
- gradian: {
4137
- name: "gradian",
4138
- base: BASE_UNITS.ANGLE,
4139
- prefixes: PREFIXES.LONG,
4140
- value: null,
4141
- // will be filled in by calculateAngleValues()
4142
- offset: 0
4143
- },
4144
- // cycle = rad / (2*pi) = rad / 6.2831853071795864769252867665793
4145
- cycle: {
4146
- name: "cycle",
4147
- base: BASE_UNITS.ANGLE,
4148
- prefixes: PREFIXES.NONE,
4149
- value: null,
4150
- // will be filled in by calculateAngleValues()
4151
- offset: 0
4152
- },
4153
- // arcsec = rad / (3600 * (360 / 2 * pi)) = rad / 0.0000048481368110953599358991410235795
4154
- arcsec: {
4155
- name: "arcsec",
4156
- base: BASE_UNITS.ANGLE,
4157
- prefixes: PREFIXES.NONE,
4158
- value: null,
4159
- // will be filled in by calculateAngleValues()
4160
- offset: 0
4161
- },
4162
- // arcmin = rad / (60 * (360 / 2 * pi)) = rad / 0.00029088820866572159615394846141477
4163
- arcmin: {
4164
- name: "arcmin",
4165
- base: BASE_UNITS.ANGLE,
4166
- prefixes: PREFIXES.NONE,
4167
- value: null,
4168
- // will be filled in by calculateAngleValues()
4169
- offset: 0
4170
- },
4171
- // Electric current
4172
- A: {
4173
- name: "A",
4174
- base: BASE_UNITS.CURRENT,
4175
- prefixes: PREFIXES.SHORT,
4176
- value: 1,
4177
- offset: 0
4178
- },
4179
- ampere: {
4180
- name: "ampere",
4181
- base: BASE_UNITS.CURRENT,
4182
- prefixes: PREFIXES.LONG,
4183
- value: 1,
4184
- offset: 0
4185
- },
4186
- // Temperature
4187
- // K(C) = °C + 273.15
4188
- // K(F) = (°F + 459.67) * (5 / 9)
4189
- // K(R) = °R * (5 / 9)
4190
- K: {
4191
- name: "K",
4192
- base: BASE_UNITS.TEMPERATURE,
4193
- prefixes: PREFIXES.SHORT,
4194
- value: 1,
4195
- offset: 0
4196
- },
4197
- degC: {
4198
- name: "degC",
4199
- base: BASE_UNITS.TEMPERATURE,
4200
- prefixes: PREFIXES.SHORT,
4201
- value: 1,
4202
- offset: 273.15
4203
- },
4204
- degF: {
4205
- name: "degF",
4206
- base: BASE_UNITS.TEMPERATURE,
4207
- prefixes: PREFIXES.SHORT,
4208
- value: new Fraction2(5, 9),
4209
- offset: 459.67
4210
- },
4211
- degR: {
4212
- name: "degR",
4213
- base: BASE_UNITS.TEMPERATURE,
4214
- prefixes: PREFIXES.SHORT,
4215
- value: new Fraction2(5, 9),
4216
- offset: 0
4217
- },
4218
- kelvin: {
4219
- name: "kelvin",
4220
- base: BASE_UNITS.TEMPERATURE,
4221
- prefixes: PREFIXES.LONG,
4222
- value: 1,
4223
- offset: 0
4224
- },
4225
- celsius: {
4226
- name: "celsius",
4227
- base: BASE_UNITS.TEMPERATURE,
4228
- prefixes: PREFIXES.LONG,
4229
- value: 1,
4230
- offset: 273.15
4231
- },
4232
- fahrenheit: {
4233
- name: "fahrenheit",
4234
- base: BASE_UNITS.TEMPERATURE,
4235
- prefixes: PREFIXES.LONG,
4236
- value: new Fraction2(5, 9),
4237
- offset: 459.67
4238
- },
4239
- rankine: {
4240
- name: "rankine",
4241
- base: BASE_UNITS.TEMPERATURE,
4242
- prefixes: PREFIXES.LONG,
4243
- value: new Fraction2(5, 9),
4244
- offset: 0
4245
- },
4246
- // amount of substance
4247
- mol: {
4248
- name: "mol",
4249
- base: BASE_UNITS.AMOUNT_OF_SUBSTANCE,
4250
- prefixes: PREFIXES.SHORT,
4251
- value: 1,
4252
- offset: 0
4253
- },
4254
- mole: {
4255
- name: "mole",
4256
- base: BASE_UNITS.AMOUNT_OF_SUBSTANCE,
4257
- prefixes: PREFIXES.LONG,
4258
- value: 1,
4259
- offset: 0
4260
- },
4261
- // luminous intensity
4262
- cd: {
4263
- name: "cd",
4264
- base: BASE_UNITS.LUMINOUS_INTENSITY,
4265
- prefixes: PREFIXES.SHORT,
4266
- value: 1,
4267
- offset: 0
4268
- },
4269
- candela: {
4270
- name: "candela",
4271
- base: BASE_UNITS.LUMINOUS_INTENSITY,
4272
- prefixes: PREFIXES.LONG,
4273
- value: 1,
4274
- offset: 0
4275
- },
4276
- // Solid angle
4277
- sr: {
4278
- name: "sr",
4279
- base: BASE_UNITS.SOLID_ANGLE,
4280
- prefixes: PREFIXES.NONE,
4281
- value: 1,
4282
- offset: 0
4283
- },
4284
- steradian: {
4285
- name: "steradian",
4286
- base: BASE_UNITS.SOLID_ANGLE,
4287
- prefixes: PREFIXES.LONG,
4288
- value: 1,
4289
- offset: 0
4290
- },
4291
- // Force
4292
- N: {
4293
- name: "N",
4294
- base: BASE_UNITS.FORCE,
4295
- prefixes: PREFIXES.SHORT,
4296
- value: 1,
4297
- offset: 0
4298
- },
4299
- newton: {
4300
- name: "newton",
4301
- base: BASE_UNITS.FORCE,
4302
- prefixes: PREFIXES.LONG,
4303
- value: 1,
4304
- offset: 0
4305
- },
4306
- dyn: {
4307
- name: "dyn",
4308
- base: BASE_UNITS.FORCE,
4309
- prefixes: PREFIXES.SHORT,
4310
- value: 1e-5,
4311
- offset: 0
4312
- },
4313
- dyne: {
4314
- name: "dyne",
4315
- base: BASE_UNITS.FORCE,
4316
- prefixes: PREFIXES.LONG,
4317
- value: 1e-5,
4318
- offset: 0
4319
- },
4320
- lbf: {
4321
- name: "lbf",
4322
- base: BASE_UNITS.FORCE,
4323
- prefixes: PREFIXES.NONE,
4324
- value: 4.4482216152605,
4325
- offset: 0
4326
- },
4327
- poundforce: {
4328
- name: "poundforce",
4329
- base: BASE_UNITS.FORCE,
4330
- prefixes: PREFIXES.NONE,
4331
- value: 4.4482216152605,
4332
- offset: 0
4333
- },
4334
- kip: {
4335
- name: "kip",
4336
- base: BASE_UNITS.FORCE,
4337
- prefixes: PREFIXES.LONG,
4338
- value: 4448.2216,
4339
- offset: 0
4340
- },
4341
- kilogramforce: {
4342
- name: "kilogramforce",
4343
- base: BASE_UNITS.FORCE,
4344
- prefixes: PREFIXES.NONE,
4345
- value: 9.80665,
4346
- offset: 0
4347
- },
4348
- // Energy
4349
- J: {
4350
- name: "J",
4351
- base: BASE_UNITS.ENERGY,
4352
- prefixes: PREFIXES.SHORT,
4353
- value: 1,
4354
- offset: 0
4355
- },
4356
- joule: {
4357
- name: "joule",
4358
- base: BASE_UNITS.ENERGY,
4359
- prefixes: PREFIXES.LONG,
4360
- value: 1,
4361
- offset: 0
4362
- },
4363
- erg: {
4364
- name: "erg",
4365
- base: BASE_UNITS.ENERGY,
4366
- prefixes: PREFIXES.SHORTLONG,
4367
- // Both kiloerg and kerg are acceptable
4368
- value: 1e-7,
4369
- offset: 0
4370
- },
4371
- Wh: {
4372
- name: "Wh",
4373
- base: BASE_UNITS.ENERGY,
4374
- prefixes: PREFIXES.SHORT,
4375
- value: 3600,
4376
- offset: 0
4377
- },
4378
- BTU: {
4379
- name: "BTU",
4380
- base: BASE_UNITS.ENERGY,
4381
- prefixes: PREFIXES.BTU,
4382
- value: 1055.05585262,
4383
- offset: 0
4384
- },
4385
- eV: {
4386
- name: "eV",
4387
- base: BASE_UNITS.ENERGY,
4388
- prefixes: PREFIXES.SHORT,
4389
- value: 1602176634e-28,
4390
- offset: 0
4391
- },
4392
- electronvolt: {
4393
- name: "electronvolt",
4394
- base: BASE_UNITS.ENERGY,
4395
- prefixes: PREFIXES.LONG,
4396
- value: 1602176634e-28,
4397
- offset: 0
4398
- },
4399
- // Power
4400
- W: {
4401
- name: "W",
4402
- base: BASE_UNITS.POWER,
4403
- prefixes: PREFIXES.SHORT,
4404
- value: 1,
4405
- offset: 0
4406
- },
4407
- watt: {
4408
- name: "watt",
4409
- base: BASE_UNITS.POWER,
4410
- prefixes: PREFIXES.LONG,
4411
- value: 1,
4412
- offset: 0
4413
- },
4414
- hp: {
4415
- name: "hp",
4416
- base: BASE_UNITS.POWER,
4417
- prefixes: PREFIXES.NONE,
4418
- value: 745.6998715386,
4419
- offset: 0
4420
- },
4421
- // Electrical power units
4422
- VAR: {
4423
- name: "VAR",
4424
- base: BASE_UNITS.POWER,
4425
- prefixes: PREFIXES.SHORT,
4426
- value: Complex2.I,
4427
- offset: 0
4428
- },
4429
- VA: {
4430
- name: "VA",
4431
- base: BASE_UNITS.POWER,
4432
- prefixes: PREFIXES.SHORT,
4433
- value: 1,
4434
- offset: 0
4435
- },
4436
- // Pressure
4437
- Pa: {
4438
- name: "Pa",
4439
- base: BASE_UNITS.PRESSURE,
4440
- prefixes: PREFIXES.SHORT,
4441
- value: 1,
4442
- offset: 0
4443
- },
4444
- psi: {
4445
- name: "psi",
4446
- base: BASE_UNITS.PRESSURE,
4447
- prefixes: PREFIXES.NONE,
4448
- value: 6894.75729276459,
4449
- offset: 0
4450
- },
4451
- atm: {
4452
- name: "atm",
4453
- base: BASE_UNITS.PRESSURE,
4454
- prefixes: PREFIXES.NONE,
4455
- value: 101325,
4456
- offset: 0
4457
- },
4458
- bar: {
4459
- name: "bar",
4460
- base: BASE_UNITS.PRESSURE,
4461
- prefixes: PREFIXES.SHORTLONG,
4462
- value: 1e5,
4463
- offset: 0
4464
- },
4465
- torr: {
4466
- name: "torr",
4467
- base: BASE_UNITS.PRESSURE,
4468
- prefixes: PREFIXES.NONE,
4469
- value: 133.322,
4470
- offset: 0
4471
- },
4472
- mmHg: {
4473
- name: "mmHg",
4474
- base: BASE_UNITS.PRESSURE,
4475
- prefixes: PREFIXES.NONE,
4476
- value: 133.322,
4477
- offset: 0
4478
- },
4479
- mmH2O: {
4480
- name: "mmH2O",
4481
- base: BASE_UNITS.PRESSURE,
4482
- prefixes: PREFIXES.NONE,
4483
- value: 9.80665,
4484
- offset: 0
4485
- },
4486
- cmH2O: {
4487
- name: "cmH2O",
4488
- base: BASE_UNITS.PRESSURE,
4489
- prefixes: PREFIXES.NONE,
4490
- value: 98.0665,
4491
- offset: 0
4492
- },
4493
- // Electric charge
4494
- coulomb: {
4495
- name: "coulomb",
4496
- base: BASE_UNITS.ELECTRIC_CHARGE,
4497
- prefixes: PREFIXES.LONG,
4498
- value: 1,
4499
- offset: 0
4500
- },
4501
- C: {
4502
- name: "C",
4503
- base: BASE_UNITS.ELECTRIC_CHARGE,
4504
- prefixes: PREFIXES.SHORT,
4505
- value: 1,
4506
- offset: 0
4507
- },
4508
- // Electric capacitance
4509
- farad: {
4510
- name: "farad",
4511
- base: BASE_UNITS.ELECTRIC_CAPACITANCE,
4512
- prefixes: PREFIXES.LONG,
4513
- value: 1,
4514
- offset: 0
4515
- },
4516
- F: {
4517
- name: "F",
4518
- base: BASE_UNITS.ELECTRIC_CAPACITANCE,
4519
- prefixes: PREFIXES.SHORT,
4520
- value: 1,
4521
- offset: 0
4522
- },
4523
- // Electric potential
4524
- volt: {
4525
- name: "volt",
4526
- base: BASE_UNITS.ELECTRIC_POTENTIAL,
4527
- prefixes: PREFIXES.LONG,
4528
- value: 1,
4529
- offset: 0
4530
- },
4531
- V: {
4532
- name: "V",
4533
- base: BASE_UNITS.ELECTRIC_POTENTIAL,
4534
- prefixes: PREFIXES.SHORT,
4535
- value: 1,
4536
- offset: 0
4537
- },
4538
- // Electric resistance
4539
- ohm: {
4540
- name: "ohm",
4541
- base: BASE_UNITS.ELECTRIC_RESISTANCE,
4542
- prefixes: PREFIXES.SHORTLONG,
4543
- // Both Mohm and megaohm are acceptable
4544
- value: 1,
4545
- offset: 0
4546
- },
4547
- /*
4548
- * Unicode breaks in browsers if charset is not specified
4549
- Ω: {
4550
- name: 'Ω',
4551
- base: BASE_UNITS.ELECTRIC_RESISTANCE,
4552
- prefixes: PREFIXES.SHORT,
4553
- value: 1,
4554
- offset: 0
4555
- },
4556
- */
4557
- // Electric inductance
4558
- henry: {
4559
- name: "henry",
4560
- base: BASE_UNITS.ELECTRIC_INDUCTANCE,
4561
- prefixes: PREFIXES.LONG,
4562
- value: 1,
4563
- offset: 0
4564
- },
4565
- H: {
4566
- name: "H",
4567
- base: BASE_UNITS.ELECTRIC_INDUCTANCE,
4568
- prefixes: PREFIXES.SHORT,
4569
- value: 1,
4570
- offset: 0
4571
- },
4572
- // Electric conductance
4573
- siemens: {
4574
- name: "siemens",
4575
- base: BASE_UNITS.ELECTRIC_CONDUCTANCE,
4576
- prefixes: PREFIXES.LONG,
4577
- value: 1,
4578
- offset: 0
4579
- },
4580
- S: {
4581
- name: "S",
4582
- base: BASE_UNITS.ELECTRIC_CONDUCTANCE,
4583
- prefixes: PREFIXES.SHORT,
4584
- value: 1,
4585
- offset: 0
4586
- },
4587
- // Magnetic flux
4588
- weber: {
4589
- name: "weber",
4590
- base: BASE_UNITS.MAGNETIC_FLUX,
4591
- prefixes: PREFIXES.LONG,
4592
- value: 1,
4593
- offset: 0
4594
- },
4595
- Wb: {
4596
- name: "Wb",
4597
- base: BASE_UNITS.MAGNETIC_FLUX,
4598
- prefixes: PREFIXES.SHORT,
4599
- value: 1,
4600
- offset: 0
4601
- },
4602
- // Magnetic flux density
4603
- tesla: {
4604
- name: "tesla",
4605
- base: BASE_UNITS.MAGNETIC_FLUX_DENSITY,
4606
- prefixes: PREFIXES.LONG,
4607
- value: 1,
4608
- offset: 0
4609
- },
4610
- T: {
4611
- name: "T",
4612
- base: BASE_UNITS.MAGNETIC_FLUX_DENSITY,
4613
- prefixes: PREFIXES.SHORT,
4614
- value: 1,
4615
- offset: 0
4616
- },
4617
- // Binary
4618
- b: {
4619
- name: "b",
4620
- base: BASE_UNITS.BIT,
4621
- prefixes: PREFIXES.BINARY_SHORT,
4622
- value: 1,
4623
- offset: 0
4624
- },
4625
- bits: {
4626
- name: "bits",
4627
- base: BASE_UNITS.BIT,
4628
- prefixes: PREFIXES.BINARY_LONG,
4629
- value: 1,
4630
- offset: 0
4631
- },
4632
- B: {
4633
- name: "B",
4634
- base: BASE_UNITS.BIT,
4635
- prefixes: PREFIXES.BINARY_SHORT,
4636
- value: 8,
4637
- offset: 0
4638
- },
4639
- bytes: {
4640
- name: "bytes",
4641
- base: BASE_UNITS.BIT,
4642
- prefixes: PREFIXES.BINARY_LONG,
4643
- value: 8,
4644
- offset: 0
4645
- }
4646
- };
4647
- const ALIASES = {
4648
- meters: "meter",
4649
- // Astronomical / nautical / typography aliases (B-5 port). Lowercase
4650
- // 'au' is deliberately ABSENT: it collides with the atomic unit of
4651
- // length (Bohr radius, ~5.29e-11 m), 21 orders of magnitude smaller.
4652
- AU: "astronomicalUnit",
4653
- astronomicalUnits: "astronomicalUnit",
4654
- lightyears: "lightyear",
4655
- parsecs: "parsec",
4656
- nmi: "nauticalMile",
4657
- nauticalMiles: "nauticalMile",
4658
- fathoms: "fathom",
4659
- furlongs: "furlong",
4660
- points: "point",
4661
- picas: "pica",
4662
- inches: "inch",
4663
- feet: "foot",
4664
- yards: "yard",
4665
- miles: "mile",
4666
- links: "link",
4667
- rods: "rod",
4668
- chains: "chain",
4669
- angstroms: "angstrom",
4670
- lt: "l",
4671
- litres: "litre",
4672
- liter: "litre",
4673
- liters: "litre",
4674
- teaspoons: "teaspoon",
4675
- tablespoons: "tablespoon",
4676
- minims: "minim",
4677
- fldr: "fluiddram",
4678
- fluiddrams: "fluiddram",
4679
- floz: "fluidounce",
4680
- fluidounces: "fluidounce",
4681
- gi: "gill",
4682
- gills: "gill",
4683
- cp: "cup",
4684
- cups: "cup",
4685
- pt: "pint",
4686
- pints: "pint",
4687
- qt: "quart",
4688
- quarts: "quart",
4689
- gal: "gallon",
4690
- gallons: "gallon",
4691
- bbl: "beerbarrel",
4692
- beerbarrels: "beerbarrel",
4693
- obl: "oilbarrel",
4694
- oilbarrels: "oilbarrel",
4695
- hogsheads: "hogshead",
4696
- gtts: "gtt",
4697
- grams: "gram",
4698
- tons: "ton",
4699
- tonnes: "tonne",
4700
- grains: "grain",
4701
- drams: "dram",
4702
- ounces: "ounce",
4703
- poundmasses: "poundmass",
4704
- hundredweights: "hundredweight",
4705
- sticks: "stick",
4706
- lb: "lbm",
4707
- lbs: "lbm",
4708
- kips: "kip",
4709
- kgf: "kilogramforce",
4710
- acres: "acre",
4711
- hectares: "hectare",
4712
- sqfeet: "sqft",
4713
- sqyard: "sqyd",
4714
- sqmile: "sqmi",
4715
- sqmiles: "sqmi",
4716
- mmhg: "mmHg",
4717
- mmh2o: "mmH2O",
4718
- cmh2o: "cmH2O",
4719
- seconds: "second",
4720
- secs: "second",
4721
- minutes: "minute",
4722
- mins: "minute",
4723
- hours: "hour",
4724
- hr: "hour",
4725
- hrs: "hour",
4726
- days: "day",
4727
- weeks: "week",
4728
- months: "month",
4729
- years: "year",
4730
- decades: "decade",
4731
- centuries: "century",
4732
- millennia: "millennium",
4733
- hertz: "hertz",
4734
- radians: "radian",
4735
- degrees: "degree",
4736
- gradians: "gradian",
4737
- cycles: "cycle",
4738
- arcsecond: "arcsec",
4739
- arcseconds: "arcsec",
4740
- arcminute: "arcmin",
4741
- arcminutes: "arcmin",
4742
- BTUs: "BTU",
4743
- watts: "watt",
4744
- joules: "joule",
4745
- amperes: "ampere",
4746
- amps: "ampere",
4747
- amp: "ampere",
4748
- coulombs: "coulomb",
4749
- volts: "volt",
4750
- ohms: "ohm",
4751
- farads: "farad",
4752
- webers: "weber",
4753
- teslas: "tesla",
4754
- electronvolts: "electronvolt",
4755
- moles: "mole",
4756
- bit: "bits",
4757
- byte: "bytes"
4758
- };
3993
+ function imaginaryValue(scale) {
3994
+ const i = Complex2.I;
3995
+ return scale === 1 || i === void 0 ? i : multiplyScalar2(i, scale);
3996
+ }
3997
+ const UNITS = {};
3998
+ for (const key of Object.keys(UNIT_ROWS)) {
3999
+ const row = UNIT_ROWS[key];
4000
+ const exact = readUnitScale(row.scale);
4001
+ const scaled = exactScaleToNumber(exact);
4002
+ const exactOffset = row.offset === void 0 ? UNIT_ZERO_SCALE : readUnitScale(row.offset);
4003
+ const def = {
4004
+ name: row.name ?? key,
4005
+ base: BASE_UNITS[row.base],
4006
+ prefixes: PREFIXES[row.prefixes],
4007
+ value: row.imaginary ? imaginaryValue(scaled) : scaled,
4008
+ offset: exactScaleToNumber(exactOffset)
4009
+ };
4010
+ if (row.reciprocal) def.reciprocal = true;
4011
+ if (!row.imaginary) attachExactScale(def, exact, exactOffset);
4012
+ UNITS[key] = def;
4013
+ }
4759
4014
  function calculateAngleValues(config3) {
4760
- if (config3.number === "BigNumber") {
4761
- const pi = BIGNUMBER_PI;
4762
- UNITS.rad.value = new BigNumber2(1);
4763
- UNITS.deg.value = pi.div(180);
4764
- UNITS.grad.value = pi.div(200);
4765
- UNITS.cycle.value = pi.times(2);
4766
- UNITS.arcsec.value = pi.div(648e3);
4767
- UNITS.arcmin.value = pi.div(10800);
4768
- } else {
4769
- UNITS.rad.value = 1;
4770
- UNITS.deg.value = Math.PI / 180;
4771
- UNITS.grad.value = Math.PI / 200;
4772
- UNITS.cycle.value = Math.PI * 2;
4773
- UNITS.arcsec.value = Math.PI / 648e3;
4774
- UNITS.arcmin.value = Math.PI / 10800;
4015
+ for (const key in UNITS) {
4016
+ if (!hasOwnProperty(UNITS, key)) continue;
4017
+ const exact = UNITS[key].exact;
4018
+ if (exact === void 0 || exact.pi === 0) continue;
4019
+ UNITS[key].value = config3.number === "BigNumber" ? exactToBigNumber(exact) : exactScaleToNumber(exact);
4775
4020
  }
4776
- UNITS.radian.value = UNITS.rad.value;
4777
- UNITS.degree.value = UNITS.deg.value;
4778
- UNITS.gradian.value = UNITS.grad.value;
4779
4021
  }
4780
- calculateAngleValues(config2);
4781
4022
  if (on) {
4782
4023
  on("config", function(curr, prev) {
4783
4024
  if (curr.number !== prev.number) {
@@ -4891,9 +4132,9 @@ var createUnitClass = /* @__PURE__ */ factory(
4891
4132
  unit.dimensions = unit.base.dimensions;
4892
4133
  }
4893
4134
  }
4894
- for (const name2 in ALIASES) {
4895
- if (hasOwnProperty(ALIASES, name2)) {
4896
- const unit = UNITS[ALIASES[name2]];
4135
+ for (const name2 in UNIT_ROW_ALIASES) {
4136
+ if (hasOwnProperty(UNIT_ROW_ALIASES, name2)) {
4137
+ const unit = UNITS[UNIT_ROW_ALIASES[name2]];
4897
4138
  const alias = {};
4898
4139
  const aliasRec = alias;
4899
4140
  const unitRec = unit;
@@ -4903,9 +4144,11 @@ var createUnitClass = /* @__PURE__ */ factory(
4903
4144
  }
4904
4145
  }
4905
4146
  alias.name = name2;
4147
+ if (unit.exact !== void 0) attachExactScale(alias, unit.exact, unit.exactOffset);
4906
4148
  UNITS[name2] = alias;
4907
4149
  }
4908
4150
  }
4151
+ calculateAngleValues(config2);
4909
4152
  Unit2.isValidAlpha = function isValidAlpha(c2) {
4910
4153
  return /^[a-zA-Z]$/.test(c2);
4911
4154
  };
@@ -5727,7 +4970,7 @@ var COMPLEX_NEG_ONE = new Complex(-1, 0);
5727
4970
  function isFraction2(value) {
5728
4971
  return value instanceof Fraction;
5729
4972
  }
5730
- function gcd(a, b) {
4973
+ function gcd2(a, b) {
5731
4974
  a = a < 0n ? -a : a;
5732
4975
  b = b < 0n ? -b : b;
5733
4976
  while (b !== 0n) {
@@ -5746,7 +4989,7 @@ function reducePair(num, den) {
5746
4989
  den = -den;
5747
4990
  }
5748
4991
  if (num === 0n) return [0n, 1n];
5749
- const g = gcd(num, den);
4992
+ const g = gcd2(num, den);
5750
4993
  return [num / g, den / g];
5751
4994
  }
5752
4995
  var Fraction = class _Fraction {
@@ -5801,7 +5044,7 @@ var Fraction = class _Fraction {
5801
5044
  num = -num;
5802
5045
  den = -den;
5803
5046
  }
5804
- const g = gcd(num, den);
5047
+ const g = gcd2(num, den);
5805
5048
  this.numerator = num / g;
5806
5049
  this.denominator = den / g;
5807
5050
  }
@@ -6537,6 +5780,32 @@ export {
6537
5780
  BIGNUMBER_LN10,
6538
5781
  UnitParseError,
6539
5782
  DimensionMismatchError,
5783
+ UNIT_EXACT_SCALE,
5784
+ PI_EXACT_SCALE,
5785
+ decimalExactScale,
5786
+ exactScaleOf,
5787
+ binaryExactScale,
5788
+ ratioExactScale,
5789
+ multiplyExactScales,
5790
+ divideExactScales,
5791
+ powerExactScale,
5792
+ exactScalesEqual,
5793
+ addExactScales,
5794
+ exactScaleToNumber,
5795
+ formatExactScale,
5796
+ readScaleExpression,
5797
+ UNIT_PREFIX_SETS,
5798
+ unitPrefixExactScale,
5799
+ getUnitPrefix,
5800
+ NAMED_SCALES,
5801
+ UNIT_ROWS,
5802
+ UNIT_ROW_ALIASES,
5803
+ namedExactScale,
5804
+ readUnitScale,
5805
+ getUnitRow,
5806
+ unitRowExactScale,
5807
+ unitRowValue,
5808
+ unitRowExactOffset,
6540
5809
  createUnitClass,
6541
5810
  isComplex2,
6542
5811
  Complex,