Maggiefix
Ensign
- Registriert
- Juli 2008
- Beiträge
- 226
Hallo CB,
ich habe neben meinem Hauptstudiengang ein Infomodul belegt, weil es mich interessiert. Wir beschäftigen uns dort mit Java und ich bin nun vor folgendes Problem gestellt.
Aufgabe
Gegeben sei in einem Programm Sinus.java eine Klassenmethode mySin zur Berechnung der
Funktion sin(x) mit Hilfe der Reihenentwicklung auf Rechnergenauigkeit:
b) Für sehr große Beträge von x werden die Ergebnisse auf Grund der geringeren Zahlendichte in ihrer Darstellung unbrauchbar:
[table="width: 500"]
[tr]
[td]x[/td]
[td]mySin[/td]
[td]Math.sin[/td]
[/tr]
[tr]
[td]0.523599[/td]
[td]0.5000001943375614[/td]
[td]0.5000001943375613[/td]
[/tr]
[tr]
[td]3.665191[/td]
[td]-0.49999962831216327[/td]
[td]-0.49999962831216327[/td]
[/tr]
[tr]
[td]50.789081[/td]
[td]-5696.319152438529[/td]
[td]0.4999997981857671[/td]
[/tr]
[tr]
[td][/td]
[td][/td]
[td][/td]
[/tr]
[tr]
[td][/td]
[td][/td]
[td][/td]
[/tr]
[tr]
[td][/td]
[td][/td]
[td][/td]
[/tr]
[/table]
Implementieren Sie eine neue Klassenmethode mySinBesser, welche zunächst den Parameter auf das dichtere Intervall [0, (pi/2)] transformiert und anschließend die Methode mySin mit dem transformierten Wert aufruft.
Frage
Mir ist bewusst, dass Java maximal mit einer Genauigkeit von 64bit (double) rechnet und es deshalb zu Rechenfehlern kommen kann. Jedoch weiß ich nicht wie das mit dem Intervall gemeint ist bzw. wie ich das realisieren soll. Ich wäre wirklich dankbar, für einen Denkanstoß!
ich habe neben meinem Hauptstudiengang ein Infomodul belegt, weil es mich interessiert. Wir beschäftigen uns dort mit Java und ich bin nun vor folgendes Problem gestellt.
Aufgabe
Gegeben sei in einem Programm Sinus.java eine Klassenmethode mySin zur Berechnung der
Funktion sin(x) mit Hilfe der Reihenentwicklung auf Rechnergenauigkeit:
Code:
public static double mySin( double x)
{
double summeNeu, summeAlt, summand;
int i = 1;
summand = summeNeu = x;
do
{
summeAlt = summeNeu;
i++; summand = - summand * x * x / i;
i++; summand = summand / i;
summeNeu = summeAlt + summand;
} while( summeNeu != summeAlt);
return summeNeu;
}
b) Für sehr große Beträge von x werden die Ergebnisse auf Grund der geringeren Zahlendichte in ihrer Darstellung unbrauchbar:
[table="width: 500"]
[tr]
[td]x[/td]
[td]mySin[/td]
[td]Math.sin[/td]
[/tr]
[tr]
[td]0.523599[/td]
[td]0.5000001943375614[/td]
[td]0.5000001943375613[/td]
[/tr]
[tr]
[td]3.665191[/td]
[td]-0.49999962831216327[/td]
[td]-0.49999962831216327[/td]
[/tr]
[tr]
[td]50.789081[/td]
[td]-5696.319152438529[/td]
[td]0.4999997981857671[/td]
[/tr]
[tr]
[td][/td]
[td][/td]
[td][/td]
[/tr]
[tr]
[td][/td]
[td][/td]
[td][/td]
[/tr]
[tr]
[td][/td]
[td][/td]
[td][/td]
[/tr]
[/table]
Implementieren Sie eine neue Klassenmethode mySinBesser, welche zunächst den Parameter auf das dichtere Intervall [0, (pi/2)] transformiert und anschließend die Methode mySin mit dem transformierten Wert aufruft.
Frage
Mir ist bewusst, dass Java maximal mit einer Genauigkeit von 64bit (double) rechnet und es deshalb zu Rechenfehlern kommen kann. Jedoch weiß ich nicht wie das mit dem Intervall gemeint ist bzw. wie ich das realisieren soll. Ich wäre wirklich dankbar, für einen Denkanstoß!