Sinus, Kosinus

Network

Top Contributor
Hi,

um verschiedene Winkel zu berechnen, muss ich Sinus und Kosinus anwenden sowie derren Gegenstücke.
Das muss aber immer wieder zur Laufzeit passieren und zwar sehr oft.

Wäre es evt. schneller, statt der Berechnung der einzelnen Sinuswerte für jeden Grad den entsprechenden asin und acos in einer HashMap zu speichern.

Kennt sich da wer aus?

Vielen Dank
Gruß
Network
 

njans

Top Contributor
Das kommt immer darauf an, wie oft du da die Werte berechnen musst :)
"passieren und zwar sehr oft." Wie oft ist "oft" ?
Außerdem ist die Frage, wenn du das läufen lässt, musst du da wirklich so merklich warten, bis die Berechnung der Winkel fertig ist?
 

Marco13

Top Contributor
In einer HashMap sicher nicht. Bei einem Array hatte ich es zumindest für möglich gehalten, aber hätte auch eher auf "nein" getippt. Das, was heutzutage langsam ist, ist nicht mehr das Rechnen, sondern Speicherzugriffe. Nun, das war eigentlich schon immer so.
Java:
import java.util.Random;


public class SinCosLookupTest
{
    private static final double sinLookup[] = createSinLookup();
    private static final double cosLookup[] = createCosLookup();
    
    public static void main(String[] args)
    {
        for (int i=10000; i<=100000; i+=10000)
        {
            for (int size=1000; size<=10000; size+=1000)
            {
                testCompute(size, i);
                testLookup(size, i);
            }
        }
    }

    private static void testCompute(int size, int passes)
    {
        //System.out.println("Compute "+size+" "+passes);
        int angles[] = createRandomAngles(size);
        long before = System.nanoTime();
        double result = runCompute(angles, passes);
        long after = System.nanoTime();
        double duration = (after-before)*1e-6;
        System.out.println("Compute "+size+" "+passes+" "+result+" time "+duration);
    }
    
    private static void testLookup(int size, int passes)
    {
        //System.out.println("Lookup  "+size+" "+passes);
        int angles[] = createRandomAngles(size);
        long before = System.nanoTime();
        double result = runLookup(angles, passes);
        long after = System.nanoTime();
        double duration = (after-before)*1e-6;
        System.out.println("Lookup  "+size+" "+passes+" "+result+" time "+duration);
    }
    
    
    
    private static double[] createSinLookup()
    {
        double result[] = new double[360];
        for (int i=0; i<360; i++)
        {
            result[i] = Math.sin(i);
        }
        return result;
    }
    
    private static double[] createCosLookup()
    {
        double result[] = new double[360];
        for (int i=0; i<360; i++)
        {
            result[i] = Math.cos(i);
        }
        return result;
    }

    private static double runCompute(int angles[], int passes)
    {
        double result = 0;
        for (int i=0; i<passes; i++)
        {
            for (int j=0; j<angles.length; j++)
            {
                result += cosLookup[angles[j]];
                result += sinLookup[angles[j]];
            }
        }
        return result;
    }
    
    private static double runLookup(int angles[], int passes)
    {
        double result = 0;
        for (int i=0; i<passes; i++)
        {
            for (int j=0; j<angles.length; j++)
            {
                result += Math.cos(angles[j]);
                result += Math.sin(angles[j]);
            }
        }
        return result;
    }

    private static int[] createRandomAngles(int size)
    {
        Random random = new Random(0);
        int result[] = new int[size];
        for (int i=0; i<size; i++)
        {
            result[i] = random.nextInt(360);
        }
        return result;
    }
}
 

Network

Top Contributor
Vielen Dank für die Antwort.

Und nur um die erste Antwort wiederum zu beantworten:
Unbestimmt. Es handelt sich nicht um einen festen Algorithmus der immer eine bestimmte Anzahl ausrechnet. Das kann von 0 bis 1000 alle paar 10 Millisekunden gehen. Je nach UserInput ;)

Aber ich denke die Antwort von Marco13 ist vollkommend ausreichend.

Gruß
Network
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...

Ähnliche Java Themen

Neue Themen


Oben