mikrocontroller.net

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


Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi.
#include "stdio.h"
#include "math.h"

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

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

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.

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: cproger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: AUF AUF (Gast)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Fritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tim T. (tim_taylor)
Datum:

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

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <stdio.h>
#include <math.h>

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich übe auf dem PC für einen MSP430 :)

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jakob schrieb:
> Ich übe auf dem PC für einen MSP430 :)

Freiwillig?

Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mehr oder weniger ja :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.