Problem mit Berechung Sinus "C"

Gast #1966686
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.
Gast #1966693
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;
}
#1966697
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.
Gast #1966700
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
Gast #1966703
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
#1966724
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>
#1966758
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.