Skip to content

Commit

Permalink
A nanobenchmark for Sin and an optimization.
Browse files Browse the repository at this point in the history
  • Loading branch information
pleroy committed Dec 31, 2024
1 parent 41046c7 commit 42e98bc
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 9 deletions.
8 changes: 8 additions & 0 deletions nanobenchmarks/examples.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,14 @@ BENCHMARK_FUNCTION(method_3²ᴄZ5¹::Cbrt<Rounding::Correct>);
BENCHMARK_FUNCTION(method_5²Z4¹FMA::Cbrt<Rounding::Faithful>);
BENCHMARK_FUNCTION(method_5²Z4¹FMA::Cbrt<Rounding::Correct>);

BENCHMARKED_FUNCTION(std_sin) {
return std::sin(x);
}

BENCHMARKED_FUNCTION(principia_sin) {
return Sin(x);
}

BENCHMARKED_FUNCTION(std_cos) {
return std::cos(x);
}
Expand Down
19 changes: 10 additions & 9 deletions numerics/sin_cos.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -207,10 +207,11 @@ Value SinImplementation(DoublePrecision<Argument> const θ_reduced) {
double const h² = h * (h + 2 * e);
double const h³ = h² * h;
double const polynomial_term =
((sin_x₀ * h² * CosPolynomial<fma_policy>(h²) +
cos_x₀ * FusedMultiplyAdd<fma_policy>(
h³, SinPolynomial<fma_policy>(h²), e)) +
sin_x₀_plus_h_cos_x₀.error);
FusedMultiplyAdd<fma_policy>(
cos_x₀,
FusedMultiplyAdd<fma_policy>(h³, SinPolynomial<fma_policy>(h²), e),
sin_x₀ * h² * CosPolynomial<fma_policy>(h²)) +
sin_x₀_plus_h_cos_x₀.error;
return DetectDangerousRounding(sin_x₀_plus_h_cos_x₀.value, polynomial_term);
}
}
Expand Down Expand Up @@ -241,11 +242,11 @@ Value CosImplementation(DoublePrecision<Argument> const θ_reduced) {
double const h² = h * (h + 2 * e);
double const h³ = h² * h;
double const polynomial_term =
(FusedNegatedMultiplyAdd<fma_policy>(
sin_x₀,
FusedMultiplyAdd<fma_policy>(h³, SinPolynomial<fma_policy>(h²), e),
cos_x₀ * h² * CosPolynomial<fma_policy>(h²)) +
cos_x₀_minus_h_sin_x₀.error);
FusedNegatedMultiplyAdd<fma_policy>(
sin_x₀,
FusedMultiplyAdd<fma_policy>(h³, SinPolynomial<fma_policy>(h²), e),
cos_x₀ * h² * CosPolynomial<fma_policy>(h²)) +
cos_x₀_minus_h_sin_x₀.error;
return DetectDangerousRounding(cos_x₀_minus_h_sin_x₀.value, polynomial_term);
}

Expand Down

0 comments on commit 42e98bc

Please sign in to comment.