Problem mit Berechung Sinus "C"

Gast #1966686
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
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
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
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 #1966701
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).
Gast #1966703
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
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
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

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.