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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren