Forum: PC-Programmierung Problem mit Berechung Sinus "C"


von Jakob (Gast)


Lesenswert?

Hi.
1
#include "stdio.h"
2
#include "math.h"
3
4
float test_float=0;
5
__int16 test_int=0;
6
float Pi=3.141593;
7
8
int main()
9
{
10
  test_float=10000*sin(2*Pi*(1200/2000));
11
  test_int=(int)test_float;
12
  printf("%x",test_int);
13
  printf("\n%x",test_float);
14
  getchar();
15
  return 0;
16
}

Irgendwie gibt der Computer NULL aus, aber ich möchte, dass da -5878 
bzw. -5877.852523 in der Ausgabe steht.

Ich finde den Fehler nicht und die Suche hat mir auch nicht geholfen.

von Rolf M. (rmagnus)


Lesenswert?

%x ist nicht der richtige Format-Spezifizierer für float. Außerdem 
ergibt 1200/2000 den Wert 0, weil beide Werte vom Typ int sind und somit 
die Division auch mit Typ int durchgeführt wird.

von Klaus W. (mfgkw)


Lesenswert?

1200/2000 ist eine ganzzahlige Division mit dem Ergebnis 0.
Damit berechnest du den Sinus von 0.0.

von cproger (Gast)


Lesenswert?

Hoi

Probier mal

#include "stdio.h"
#include "math.h"

float test_float=0;
int test_int=0;
float Pi=3.141593;

int main()
{
  test_float=10000*sin(2*Pi*((float)1200/2000));
  test_int=(int)test_float;
  printf("%f",test_int);
  printf("\n%f",test_float);
  getchar();
  return 0;
}

von AUF AUF (Gast)


Lesenswert?

Warum %x und nicht %d fuer int oder %f fuer float? Ein .0 bei allen 
float Zahlen schadet auch nicht.

von Klaus W. (mfgkw)


Lesenswert?

Abgesehen davon, daß es in C zu 99% unsinnig ist, in float zu
rechnen, da alle Operationen sowieso in double durchgeführt
werden und mit float zusätzliche Konvertierungen anfallen - damit
ist float im Zweifelsfall langsamer als double.

float braucht man allenfalls, um bei großen Feldern Platz zu
sparen, wobei "groß" bei aktuellen PCs im GB-Bereich liegt.
Zudem natürlich bei MC, aber wir sind hier in der Rubrik
PC-Programmierung.

von Jakob (Gast)


Lesenswert?

Man muss ja echt eine Menge beachten :)

auf das float(1200/2000) wäre ich nie gekommen.
Das mit dem %x ist schon okay, mich interessieren nur HEX werte. Und ja 
ich übe für µC damit ist float schon ne gute Wahl denke ich :)

Danke für den Hinweis Leute

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

1. Benutze double statt float.
2. Benutze M_PI aus der math.h.
3. Mach aus 1200/2000 einen Typecast auf double oder eine der beiden 
Zahlen zum double (z.B. 1200.0).

von Fritz (Gast)


Lesenswert?

Versuche mal das

int main()
{
  test_float=10000*sin(2*Pi*(1200.0/2000.0));
  test_int=(int)test_float;
  printf("%x",test_int);
  printf("\n%x",test_float);
  getchar();
  return 0;
}

Ich meine : (1200/2000) sind vom Format int und das gibt 0 und nicht 0.6 
.

Viele Grüße Fritz

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

4. Für Systeme ohne FPU, also insbesondere µC, sind double und float 
eher nicht so toll. 
->http://www.mikrocontroller.net/articles/Festkommaarithmetik

von Rolf M. (rmagnus)


Lesenswert?

Jakob schrieb:
> Das mit dem %x ist schon okay, mich interessieren nur HEX werte.

Dann wirst du aber deine -5877.852523 nicht herausbekommen.

> Und ja ich übe für µC damit ist float schon ne gute Wahl denke ich :)

Dann ist sin() aber keine gute Wahl. Das konvertiert nämlich deinen 
float-Wert erstmal nach double, rechnet dann den Sinus in double aus, 
und du konvertierst das Ergebnis dann wieder zurück nach float. sinf() 
wäre dann die bessere Wahl, sofern dein Compiler nicht allzusehr 
veraltet ist.

Mir ist gerade noch aufgefallen:

> #include "stdio.h"
> #include "math.h"

Das wäre so besser:
1
#include <stdio.h>
2
#include <math.h>

von Klaus W. (mfgkw)


Lesenswert?

Tim T. schrieb:
> 4. Für Systeme ohne FPU, also insbesondere µC, sind double und float
> eher nicht so toll.
> ->http://www.mikrocontroller.net/articles/Festkommaarithmetik

Forum: PC-Programmierung

von Klaus W. (mfgkw)


Lesenswert?

Rolf Magnus schrieb:
>> Und ja ich übe für µC damit ist float schon ne gute Wahl denke ich :)
>
> Dann ist sin() aber keine gute Wahl. Das konvertiert nämlich deinen
> float-Wert erstmal nach double, rechnet dann den Sinus in double aus,
> und du konvertierst das Ergebnis dann wieder zurück nach float. sinf()
> wäre dann die bessere Wahl, sofern dein Compiler nicht allzusehr
> veraltet ist.

Auf AVR sind float und double eh dasselbe.

Ob aber überhaupt eines von beiden hier sinnvoll ist, steht auf
einem anderen Blatt.

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Klaus Wachtler schrieb:
> Tim T. schrieb:
>> 4. Für Systeme ohne FPU, also insbesondere µC, sind double und float
>> eher nicht so toll.
>> ->http://www.mikrocontroller.net/articles/Festkommaarithmetik
>
> Forum: PC-Programmierung

War nur die Antwort auf die Aussage des OP, das er float benutzt um für 
µC zu üben.

von Rolf M. (rmagnus)


Lesenswert?

Klaus Wachtler schrieb:
> Forum: PC-Programmierung

Also ich verstehe

> ich übe für µC damit ist float schon ne gute Wahl denke ich :)

so, daß er momentan noch auf dem PC die ersten Schritte macht, aber 
später ein µC das eigentliche Ziel sein soll.

Klaus Wachtler schrieb:
> Auf AVR sind float und double eh dasselbe.

"µC" heißt nicht automatisch "AVR".

von Jakob (Gast)


Lesenswert?

Ich übe auf dem PC für einen MSP430 :)

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Jakob schrieb:
> Ich übe auf dem PC für einen MSP430 :)

Freiwillig?

von Jakob (Gast)


Lesenswert?

mehr oder weniger ja :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.