Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sine approximation error in Java

I'm a bit annoyed with a method I wrote to approximate sine function in Java. Here it is, it's based on Taylor's series.

  static double PI = 3.14159265358979323846;
  static double eps = 0.0000000000000000001;

  static void sin(double x) {
    x = x % (2 * PI);
    double term = 1.0;
    double res  = 0.0;

    for (int i = 1; term > eps; i++) {
        term = term * (x / i);
        if (i % 4 == 1) res += term;
        if (i % 4 == 3) res -= term;
    }
  System.out.println(sum);
 }

For little values, I got very good approximation of sine, but for large values (e.g pow(10,22)), results seems very very wrong.

Here are the results :

 sin(pow(10,22)) // 0.8740280612007599
 Math.sin(pow(10,22)) // -0.8522008497671888

Does someone have an idea ? Thank you !

Best regards,

like image 946
Jul_DW Avatar asked Jan 20 '26 10:01

Jul_DW


1 Answers

Be reassured that the Java sin function will be off too.

You problem is that the Taylor expansion for sin has a small radius of convergence and convergence is slow even if you're within that radius.

There are floating point considerations too: a floating point double gives you about 15 significant figures of accuracy.

So for large arguments for sin, the accuracy will deteriorate significantly especially given that sin is a periodic function:

sin(x + 2 * pi * n) = sin(x) for any integer n.

like image 70
Bathsheba Avatar answered Jan 22 '26 23:01

Bathsheba



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!