MCPcopy Create free account
hub / github.com/cortex-js/compute-engine / fpsincos

Function fpsincos

src/big-decimal/utils.ts:687–824  ·  view source on GitHub ↗
(x: bigint, bits: number)

Source from the content-addressed store, hash-verified

685 * @returns [sin(x/2^bits)*2^bits, cos(x/2^bits)*2^bits]
686 */
687export function fpsincos(x: bigint, bits: number): [bigint, bigint] {
688 const B = BigInt(bits);
689 const scale = 1n << B;
690 // sin(0) = 0, cos(0) = 1
691 if (x === 0n) return [0n, scale];
692
693 const pi = fppi(bits);
694 const twoPi = 2n * pi;
695 const halfPi = pi / 2n;
696
697 // Step 1: Reduce modulo 2π to [0, 2π)
698 // For large arguments, x % twoPi loses precision because x has many
699 // more bits than twoPi. Use extended precision for the reduction.
700 let r: bigint;
701 const absX = bigintAbs(x);
702 if (absX > scale << 30n) {
703 // Large argument: compute at extended precision.
704 // Extra guard bits: bitLength(|x/scale|) + 64.
705 const extraBits = bitLength(absX) - bits + 64;
706 const extBits = bits + extraBits;
707 const extX = x << BigInt(extraBits);
708 const extPi = fppi(extBits);
709 const extTwoPi = 2n * extPi;
710
711 let extR = extX % extTwoPi;
712 if (extR < 0n) extR += extTwoPi;
713
714 // Scale back
715 r = extR >> BigInt(extraBits);
716 } else {
717 r = x % twoPi;
718 }
719 if (r < 0n) r += twoPi;
720
721 // Step 2: Quadrant reduction to [0, π/2]
722 // Determine quadrant and adjust sign
723 let sinSign = 1n;
724 let cosSign = 1n;
725
726 if (r > 3n * halfPi) {
727 // Quadrant 4: [3π/2, 2π) → sin negative, cos positive, use 2π - r
728 r = twoPi - r;
729 sinSign = -1n;
730 } else if (r > pi) {
731 // Quadrant 3: [π, 3π/2] → sin negative, cos negative, use r - π
732 r = r - pi;
733 sinSign = -1n;
734 cosSign = -1n;
735 } else if (r > halfPi) {
736 // Quadrant 2: [π/2, π] → sin positive, cos negative, use π - r
737 r = pi - r;
738 cosSign = -1n;
739 }
740 // else Quadrant 1: [0, π/2] — no change
741
742 // Step 3: Double-angle halving
743 // Each halving is cheap (integer divide by 2) but reconstruction costs O(M(p)).
744 // Each Taylor term also costs O(M(p)). Balance the two for O(√p) total steps.

Callers 1

transcendentals.tsFile · 0.90

Calls 6

fppiFunction · 0.85
bigintAbsFunction · 0.85
bitLengthFunction · 0.85
sqrtMethod · 0.65
roundMethod · 0.45
ceilMethod · 0.45

Tested by

no test coverage detected