Forum: PC-Programmierung float Nachkommastelle abschneiden


von Beginner (Gast)


Lesenswert?

Hallo, ich habe eine Funktion in der ich einen Wert berechne. Das 
Ergebnis ist "float" und hat ein Paar Nachkommastellen. Jetzt möchte ich 
gerne alle Nachkommastellen bis auf zwei abschneiden. Gibt es einen 
einfachen Weg das zu realisieren?

Danke
1
void configuration (float baudrate)
2
{
3
  float period;
4
  period=(((1/baudrate)*12)*1000000);
5
}

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Kommt drauf an, wenn der Wert klein genug ist:
1
void configuration (float baudrate)
2
{
3
  float period = (((1/baudrate)*12)*1000000);
4
  int temp  = period * 100f;
5
  period = temp / 100f;
6
}

von Einstiegsgehalt Ratgeber (Gast)


Lesenswert?

hm, also für eine Baudrate von 9600 wäre ich bei 1249,...
und für max. von 115200 bei 104,...
das könnte sogar hinhaun,

danke, werds ausprobieren.

von Sebastian (Gast)


Lesenswert?

Alternativ, wenn über die Größe der Werte keine Aussage gemacht werden 
kann:

1
#include <math.h>
2
3
void
4
configuration(float baudrate) {
5
  float period = (((1/baudrate)*12)*1000000);
6
  period = truncf(period * 100.f) / 100.f;
7
}

Statt truncf zum Abschneiden der Nachkommastellen kann auch roundf, 
floorf oder ceilf verwendet werden (Runden, Abrunden, Aufrunden). Das 
Suffix "f" steht dabei jeweils für die float-Variante (im Gegensatz zu 
double).

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Aber auch hier muss man aufpassen das period * 100 nicht größer wird als 
der Wertebereich von float sonst ist das Ergebnis nämlich INF...

von Beginner (Gast)


Lesenswert?

Hm, is etwas schwieriger als erwartet. Die Funktion mit int kann ich 
nicht nutzen da ich ausserhalb des Bereichs bin bei 9600->temp=125000.
Sebastian, danke für den Tipp, aber ich habe irgendwie Schwierigkeiten 
den math.h einzubinden. Ich benutzte CodeComposerStudio mal nebenbei 
erwähnt.

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Beginner schrieb:
> Hm, is etwas schwieriger als erwartet. Die Funktion mit int kann ich
> nicht nutzen da ich ausserhalb des Bereichs bin bei 9600->temp=125000.

Na ja, du kannst ja auch noch auf long ausweichen.

Wozu willst du eigentlich die Kommastellen abschneiden? Wenn es wegen 
einer Ausgabe ist -> das macht man anders. Da sagt man der 
Ausgabefunktion, dass man 2 Nachkomastellen haben will.

Und warum eigentlich float?
Auf einem PC willst du float nicht benutzten und wenn doch, dann nur 
unter Protest und mit einem extrem guten Grund. In allen anderen Fällen 
immer double nehmen. Auf eienm PC ist float nicht schneller als double 
(rechnet alles der Coprozessor). Aber float hat eine deutlich geringere 
Auflösung als double. Und das kann dir schon mal den Schlaf rauben, wenn 
du damit klarkommen musst, dass alles nach der 6-ten Stelle nur noch 
gelogen ist.

von Beginner (Gast)


Lesenswert?

Hallo, ich benutze eine fertige Timer Funktion von der TI Homepage,
1
void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
2
{
3
    Uint32  temp;
4
5
    // Initialize timer period:
6
    Timer->CPUFreqInMHz = Freq;
7
    Timer->PeriodInUSec = Period;
8
    temp = (long) (Freq * Period);
9
    Timer->RegsAddr->PRD.all = temp;
10
11
    // Set pre-scale counter to divide by 1 (SYSCLKOUT):
12
    Timer->RegsAddr->TPR.all  = 0;
13
    Timer->RegsAddr->TPRH.all  = 0;
14
15
    // Initialize timer control register:
16
    Timer->RegsAddr->TCR.bit.TSS = 1;      // 1 = Stop timer, 0 = Start/Restart Timer
17
    Timer->RegsAddr->TCR.bit.TRB = 1;      // 1 = reload timer
18
    Timer->RegsAddr->TCR.bit.SOFT = 1;
19
    Timer->RegsAddr->TCR.bit.FREE = 1;     // Timer Free Run
20
    Timer->RegsAddr->TCR.bit.TIE = 1;      // 0 = Disable/ 1 = Enable Timer Interrupt
21
22
    // Reset interrupt counter:
23
    Timer->InterruptCount = 0;
24
}

Eine andere Frage, ist es erlaubt Kommazahlen Registern zuzuweisen??

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Beginner schrieb:

> Eine andere Frage, ist es erlaubt Kommazahlen Registern zuzuweisen??
Warum soll es das nicht sein?

Du kannst ja auch einem int einen float zuweisen. Nur werden dann eben 
die Nachkomastellen abgeschnitten, weil ein int ja keine haben kann.
Und mit einerm Register ist es genauso.

von DirkB (Gast)


Lesenswert?

Läubi .. schrieb:
> Aber auch hier muss man aufpassen das period * 100 nicht größer wird als
> der Wertebereich von float sonst ist das Ergebnis nämlich INF...

Dann ist die Zahl aber so groß, dass die Nachkommstellen keine Rolle 
mehr spielen.

von Michael (Gast)


Lesenswert?

Beginner schrieb:
> Eine andere Frage, ist es erlaubt Kommazahlen Registern zuzuweisen??

Dem µC ist das egal, welche Bedeutung die Bits im Register haben. Die 
richtige Interpretation ist dann die Sache deiner SW.

von Beginner (Gast)


Lesenswert?

Danke

Adieu

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.