What it measures
Eight specific Math.* function results that expose how each JavaScript engine approximates transcendental functions. The floating-point values are fully deterministic within a given engine version but differ across V8, SpiderMonkey, and JavaScriptCore.
Results do not vary across hardware: the same engine on the same version always produces the same output regardless of CPU model. This makes the signal a clean engine discriminator with no hardware noise.
How it is collected
The eight expressions are computed in order, converted to strings via toString(), joined with the pipe delimiter, and fed into xxHash64 to produce a 16-character hex hash. The raw number array is also returned as value for observability. The entire computation is synchronous and typically completes in under 1 ms with no yield points and no timeouts.
Math.tan(-1e300) // index 0 — hits argument-reduction boundary
Math.log(1000) // index 1
Math.pow(Math.PI, -100) // index 2 — exercises large-exponent path
Math.acos(0.5) // index 3
Math.sinh(1) // index 4
Math.atanh(0.5) // index 5
Math.expm1(1) // index 6
Math.cbrt(100) // index 7The eight expressions hashed in order (src/signals/math.ts:19-28)
Confidence rules
| Confidence | Trigger |
|---|---|
| normal | Computation completed without exception |
| absent | Top-level catch fired (unexpected — Math functions do not throw on normal inputs) |
Why engine-bound
Each JavaScript engine implements transcendental math functions independently. V8 uses its own polynomial approximations; SpiderMonkey may use platform-native libm on some systems or its own implementations; JavaScriptCore uses its own approximations. The chosen expressions are selected to amplify these differences: Math.tan(-1e300) hits a boundary region where argument reduction differs across engines, and Math.pow(Math.PI, -100) exercises large-exponent code paths.
IEEE 754 requires results to be consistent within an engine regardless of JIT optimisation level, so the values are fully stable across sessions. A browser update that changes the math library can shift the fingerprint, but this is rare and detectable as a version-correlated event.

