Skip to content

Commit a49e9ba

Browse files
committed
AK: Remove recursion in sin(), cos()
Running benchmark 'bench_trig_cos'. Completed benchmark 'bench_trig_cos' in 93ms Running benchmark 'bench_trig_cosf'. Completed benchmark 'bench_trig_cosf' in 64ms Running benchmark 'bench_trig_sin'. Completed benchmark 'bench_trig_sin' in 74ms Running benchmark 'bench_trig_sinf'. Completed benchmark 'bench_trig_sinf' in 65ms
1 parent bffb7c3 commit a49e9ba

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

AK/Math.h

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -685,17 +685,22 @@ constexpr T sin(T angle)
685685
return ret;
686686
#else
687687
# if defined(AK_OS_SERENITY)
688-
if (angle < 0)
689-
return -sin(-angle);
688+
T sign = 1;
689+
if (angle < 0) {
690+
angle = -angle;
691+
sign = -1;
692+
}
690693

691694
if (angle >= 2 * Pi<T>)
692695
angle = fmod(angle, 2 * Pi<T>);
693696

694-
if (angle >= Pi<T>)
695-
return -sin(angle - Pi<T>);
697+
if (angle >= Pi<T>) {
698+
angle = angle - Pi<T>;
699+
sign = -sign;
700+
}
696701

697702
if (angle > Pi<T> / 2)
698-
return sin(Pi<T> - angle);
703+
angle = Pi<T> - angle;
699704

700705
// https://github.com/samhocevar/lolremez/wiki/Tutorial-4-of-5%3A-fixing-lower-order-parameters
701706
auto f = [](T x) {
@@ -720,7 +725,7 @@ constexpr T sin(T angle)
720725
}
721726
};
722727
T angle_squared = angle * angle;
723-
return angle + angle * angle_squared * f(angle_squared);
728+
return sign * (angle + angle * angle_squared * f(angle_squared));
724729
# else
725730
return __builtin_sin(angle);
726731
# endif
@@ -742,16 +747,21 @@ constexpr T cos(T angle)
742747
#else
743748
# if defined(AK_OS_SERENITY)
744749
if (angle < 0)
745-
return cos(-angle);
750+
angle = -angle;
746751

747752
if (angle >= 2 * Pi<T>)
748753
angle = fmod(angle, 2 * Pi<T>);
749754

750-
if (angle >= Pi<T>)
751-
return -cos(angle - Pi<T>);
755+
T sign = 1;
756+
if (angle >= Pi<T>) {
757+
angle = angle - Pi<T>;
758+
sign = -1;
759+
}
752760

753-
if (angle > Pi<T> / 2)
754-
return -cos(Pi<T> - angle);
761+
if (angle > Pi<T> / 2) {
762+
angle = Pi<T> - angle;
763+
sign = -sign;
764+
}
755765

756766
// https://github.com/samhocevar/lolremez/wiki/Tutorial-3-of-5:-changing-variables-for-simpler-polynomials
757767
// for cos(x): cos(x) - 1 is a function of x^2 terms, so we do the substitution on that page like
@@ -778,7 +788,7 @@ constexpr T cos(T angle)
778788
}
779789
};
780790
T angle_squared = angle * angle;
781-
return 1 + angle_squared * f(angle_squared);
791+
return sign * (1 + angle_squared * f(angle_squared));
782792
# else
783793
return __builtin_cos(angle);
784794
# endif

0 commit comments

Comments
 (0)