Sinushyperbolicus bestimmen

Neue Frage »

vektorraum Auf diesen Beitrag antworten »
Sinushyperbolicus bestimmen
Hi!

Meine erste Numerikvorlesung, gleich die ersten Probleme: Programmierkenntnisse auffrischen. Die Aufgabe ist es, den Sinushyperbolicus auf zwei verschiedene Weisen zu berechnen. Einmal mit der bekannten Routine, dann noch über die Exp-Darstellung. Ich habe es mit Excel probiert, da kommen aber beide Male die gleichen Werte raus. Kann ja aber nicht sein. Nun versuche ich mich an C.

Ich will also, dass der Computer mir den Wert des Sinushyp ausgibt, wenn ich ihm ein Wert gebe. Bisher habe ich

code:
1:
2:
3:
4:
5:
6:
7:
8:
int main()
{
    unsigned int a;
  printf("Berechnet wird der Sinushyperbolicus auf zwei verschiedene Weisen. \n\n");
  printf("Bitte den Wert eingeben:");
  scanf("%lf", &a);
  printf("SinusHyperbolicus:", sinh(a));
  system("pause");  


jedoch wird kein Wert ausgegeben. Wie erreiche ich das?

Bzw. gibt es eine bessere Variante?

Danke für eure Hilfe!
therisen Auf diesen Beitrag antworten »

Es scheitert an deinem printf-Befehl. Du könntest z.B.

code:
1:
printf("SinusHyperbolicus: %E", sinh(a));

schreiben, siehe http://www.cplusplus.com/reference/clibr...dio/printf.html

Mich wundert es, dass ihr kein MATLAB verwenden müsst. Bei uns war/ist das Pflicht.
jona89 Auf diesen Beitrag antworten »

Bin kein C-Programmierer und kann die auch nicht weiterhelfen -.-
Aber eine Frage interessehalber:

Ist dein Code kompilierbar? Weil deine main-Methode soll ja einen Integer zurückgeben was sie nicht tut, oder irre ich da?

Wie gesagt kenne mich mit C nicht aus wüsste nur das mein Compiler in Java meckern würde.
therisen Auf diesen Beitrag antworten »

Zitat:
Original von jona89
Wie gesagt kenne mich mit C nicht aus wüsste nur das mein Compiler in Java meckern würde.


C ist da nicht so empfindlich (aber nur bei der main-Routine, es wird ein Standardwert zurückgegeben):

code:
1:
2:
3:
#include <stdio.h>

int main() { printf("Hallo Welt!\n"); }
jona89 Auf diesen Beitrag antworten »

Ah wieder was gelernt smile Danke.
Bleibe trotzdem bei Java :P
vektorraum Auf diesen Beitrag antworten »

Danke, therisen. Zumindest gibt er jetzt etwas aus!

Nun sollen wir aber die Werte für berechnen. Wenn ich einen Wert da eingebe, zeigt er seltsame Ergebnisse an.

Ist die Variable a falsch belegt? Unter anderem zeigt er in der Lösung auch eine Raute usw...
 
 
asdf6548 Auf diesen Beitrag antworten »

Zitat:
Original von therisen
Zitat:
Original von jona89
Wie gesagt kenne mich mit C nicht aus wüsste nur das mein Compiler in Java meckern würde.


C ist da nicht so empfindlich (aber nur bei der main-Routine, es wird ein Standardwert zurückgegeben):

code:
1:
2:
3:
#include <stdio.h>

int main() { printf("Hallo Welt!\n"); }


glaub

code:
1:
void main(){}


geht auch, aber er eine ordentliche main-routine sieht so aus(auch wenn der ansi-standard da einen nich zu zwingt):

code:
1:
2:
3:
4:
int main(int argc, char** argv)
{
  return 0;
}
therisen Auf diesen Beitrag antworten »

Zitat:
Original von asdf6548
glaub

code:
1:
void main(){}


geht auch


Jedenfalls nicht mit gcc 4.1.2: "Fehler: »::main« muss »int« zurückgeben".
Calvin Auf diesen Beitrag antworten »
RE: Sinushyperbolicus bestimmen
Deine Variable a ist eine Integerzahl (ohne Vorzeichen). Das heißt, das alle Stellen nach dem Komma automatisch abgeschnitten werden. Gibst du 0.5 ein, wird daraus eine 0.

Aber es gibt noch weitere Fehler. Bei scanf passt %lf nicht zu einer Integervariable. Deshalb sollte der obige Code eigentlich überhaupt nicht laufen. Bei mir gibt es einen Speicherzugrifffehler.

Wie das mit gemeint ist, verstehe ich nicht so ganz verwirrt Was hälst du von folgendem Code?

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
#include <stdio.h>
#include <math.h>

int main()
{
  int i;
  double a;
  printf("Berechnet wird der Sinushyperbolicus auf zwei verschiedene Weisen. \n\n");
//  printf("Bitte den Wert eingeben:");
//  scanf("%lf", &a);
  for(i=1;i<=20;i++)
  {
    a=pow(10,-i);
    printf("SinusHyperbolicus von %E: %E\n\n", a,sinh(a));
  }
  return 0;
}
vektorraum Auf diesen Beitrag antworten »
RE: Sinushyperbolicus bestimmen
Danke Calvin, das hat schon mal sehr geholfen Konkret lautet die Aufgabe:

Man schreibe ein Programm, das y für bestimmt, wenn einmal (entsprechende Routine des Programms nutzen) und einmal durch dargestellt wird und vergleiche die erhaltenen Werte, in dem man die Resultate mit mindestens 16 gültigen Ziffern ausgibt.

Im Moment sind aber noch keine 16 Stellen erkennbar? Wie kann ich das realisieren?
jona89 Auf diesen Beitrag antworten »

Du brauchst einen anderen Datentyp in den du die Ergebnisse ausgibst.
Double ist nicht genau genug. Bei C müsste die Alternative long double sein?
Kann mich irren. therisen weiß es bestimmt.
Calvin Auf diesen Beitrag antworten »
RE: Sinushyperbolicus bestimmen
Ändere die Ausgabezeile folgendermaßen:

code:
1:
printf("SinusHyperbolicus von %E: %3.16f\n\n", a,sinh(a));


Was das bedeutet, kannst du auf der von therisen verlinkten Seite nachlesen.
vektorraum Auf diesen Beitrag antworten »
RE: Sinushyperbolicus bestimmen
Ich danke dir!!! Ich muss mich in so viele Sachen wieder reinlesen erstmal. Langsam kommt die Erinnerung wieder Augenzwinkern
vektorraum Auf diesen Beitrag antworten »
RE: Sinushyperbolicus bestimmen
Noch eine Nachfrage:

Wir sollen nun sinh mittels eines anderen Verfahrens bestimmen. Dazu habe ich die Darstellung



gewühlt und entsprechend programmiert.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
double j=sqrt(-1);

int main()
{
  int i;
  double a;
  printf("Berechnet wird der Sinushyperbolicus auf zwei verschiedene Weisen. \n\n");

  for(i=1;i<=20;i++)
  {
    a=pow(10,-i);
    printf("Mittels Routine - bestimmen von Sinh %E: %3.16f\n\n", a,sinh(a));
    printf("Mittels Exp.-funktion - bestimmen von %E: %3.16f\n\n", a,-j*sin(j*a));
  }
   system("pause");
}


Ist das okay? Bei der Definition von i war ich mir nicht so sicher, und ob er wirklich darauf zugreift.

Es kommen auch so seltsame Ergebnisse raus.

Danke fürs drüberlesen.
2pressure Auf diesen Beitrag antworten »

hehe...

Erstens definierst du i doppelt. Einmal als Integer, einmal als Double.

Zweitens ist C++ nicht in der Lage die Wurzel aus -1 zu berechnen und und kann im Type Double auch keine komplexe Zahl speichern. Desweiteren gibt dir die Sinusfunktion nur Ergebnis, wenn ihr Argument vom Type double ist.
vektorraum Auf diesen Beitrag antworten »

Ich habs gerade geändert, hab das mit dem i auch gesehen und eben entsprechend umgewandelt in ein j.

Aber welche Ausdrücke für sinh kann man denn dann noch verwenden???
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »