STM32F4 Gleitkommazahl berechnet nicht

#3368353
Lesenswert?

Hallo Alle!

mein STM32f4 Discovery Board, auf dem mac os x 8.5 mit dem toolchain 
arm-none-eabi-gcc  habe ich ein kleines programm für testzwecke 
geschrieben.

Nun habe ich gemerkt dass der controller gleitkommazahlen nicht rechnet. 
aus irgendwelchen grund steht er fest.

volatile uint32_t testzahl1 = 0.1;

in main()

wenn ich testzahl1 = testzahl1 + 0.1; so inkrementieren lasse, macht er 
nichts. wenn ich testzahl1++; so gebe geht ohne problem.


kann mir jemand bitte erklären wieso das ding so verhält. uint32_t steht 
nur für festkommazahlen?

viele grüße!

willy
Gast #3368367
Lesenswert?

uint32_t ist ein unsigned integer, aber 32 bit (sowas?) und hat daher 
den Bereich 0-4294967295, und zwar nur Ganzzahlen. Gleitkommazahlen 
werden wie immer in C mit "float" oder "double" verwendet. Das steht in 
jedem C-Buch, Bitte erst ein solches lesen und dann nochmal versuchen, 
sonst wird das gar nichts.
Angehängte Dateien:
#3368372
Lesenswert?

Hallo Dr. Sommer,

doch der controller steht fest.
1
 zahl = (uint32_t)zahl*1.3;

ich erwarte es unverändert. der controller fährt weiter nicht.
1
 
2

3
/*---------------------Includes----------------------------*/
4
#include <stdio.h>
5
#include <stm32f4_discovery.h>
6
#include "init.h"
7

8

9
void MotorLeft(void);
10
void MotorRight(void);
11

12
void setPWM(uint16_t newpwmvalue1, uint16_t newpwmvalue2);
13

14
void Delay(__IO uint32_t nCount);
15

16
volatile int16_t testdata1 = -100.99;
17
volatile int16_t testdata2 = -200.99;
18
volatile int16_t datas = 10;
19
volatile uint32_t t1 = 100000;
20

21
volatile uint32_t timecounter = 0;
22
volatile uint32_t testcounter = 0;
23

24
void TimeCounter(void);
25

26
int main(void)
27
{
28
    SystemInit(); // Quarz Einstellungen aktivieren
29
    
30
    SetupPeripherie();
31
    
32
    MotorLeft();
33
    MotorRight();
34
    
35
    while (1){
36
        /*Hier faengt die Schleife*/
37
        
38
        if (timecounter > 1000){
39
            timecounter = 0;
40
            
41
            testcounter ++;
42
            if (testcounter >= 2) {
43
                setPWM(10000,10000);
44
                
45
                testcounter = 0;
46
            }
47
            else{
48
                setPWM(50, 50);
49
            }
50
            
51
            GPIO_ToggleBits(GPIOD, GPIO_Pin_12);
52
            GPIO_ToggleBits(GPIOD, GPIO_Pin_13);
53
            GPIO_ToggleBits(GPIOD, GPIO_Pin_14);
54
            GPIO_ToggleBits(GPIOD, GPIO_Pin_15);
55
            
56
        }
57
        t1 = (uint32_t)datas/0.3;
58
        datas = datas+1;
59

60
        
61
        printf("t1: %d \n", t1);
62
        printf("testdata1: %d \n", datas);
63
        printf("testdata2: %d \n", testdata2);
64
        
65
        Delay(0x3FFFFF);
66
        
67
        
68
        
69
        /*Hier endet die Schleife*/
70
    }
71
    return 0;
72
}
73

74
void setPWM(uint16_t newpwmvalue1, uint16_t newpwmvalue2){
75
    if (newpwmvalue1 >=0) {
76
        TIM3->CCR1 = newpwmvalue1;
77
    }
78
    if (newpwmvalue2) {
79
        TIM3->CCR2 = newpwmvalue2;
80
    }
81
}
82

83
void MotorLeft(void){
84
    GPIO_SetBits(GPIOB, GPIO_Pin_11);
85
    GPIO_SetBits(GPIOB, GPIO_Pin_12);
86
}
87
void MotorRight(void){
88
    GPIO_SetBits(GPIOB, GPIO_Pin_13);
89
    GPIO_SetBits(GPIOB, GPIO_Pin_14);
90
}
91
void TimeCounter(void){
92
    timecounter++; /* 1ms Auslösung */
93
}
94

95
/**
96
  * @brief  Delay Function.
97
  * @param  nCount:specifies the Delay time length.
98
  * @retval None
99
  */
100
void Delay(__IO uint32_t nCount)
101
{
102
  while(nCount--)
103
  {
104
  }
105
}
106

107
#ifdef  USE_FULL_ASSERT
108

109
/**
110
  * @brief  Reports the name of the source file and the source line number
111
  *         where the assert_param error has occurred.
112
  * @param  file: pointer to the source file name
113
  * @param  line: assert_param error line source number
114
  * @retval None
115
  */
116
void assert_failed(uint8_t* file, uint32_t line)
117
{ 
118
  /* User can add his own implementation to report the file name and line number,
119
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
120

121
  /* Infinite loop */
122
  while (1)
123
  {
124
  }
125
}
126
#endif
127

128
/**
129
  * @}
130
  */ 
131

132
/**
133
  * @}
134
  */ 
135

136
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
#3368378
Lesenswert?

Dr. Sommer schrieb:
> koenig willy schrieb:
>> Hallo Dr. Sommer,
>>
>> doch der controller steht fest.
> Unwahrscheinlich. Eine Integer-Multiplikation kann einen Cortex-M4F
> nicht zum Absturz bringen. Eher blinken deine LED's so schnell dass du
> es nicht siehst, oder du bedienst den Debugger falsch.
>Aber wie gesagt,
> lies ein C-Buch.
1
  
2
 t1 = (uint32_t)datas/0.3;

ohne diese Berechnung blinken alle LEDs. USART printf alles 
funktioniert.
Gast #3368384
Lesenswert?

koenig willy schrieb:
> das ist auf keinen fall der grund warum der controller weiter nichts
> macht.
Der Grund ist dass du scheinbar nicht weißt was Datentypen, Integer und 
Floats sind. Lies ein C-Buch, ohne wirst du niemals etwas hinbekommen. 
Danach siehst du direkt was falsch ist und wie es richtig geht.
#3368386
Lesenswert?

Dr. Sommer schrieb:
> koenig willy schrieb:
>> das ist auf keinen fall der grund warum der controller weiter nichts
>> macht.
> Der Grund ist dass du scheinbar nicht weißt was Datentypen, Integer und
> Floats sind. Lies ein C-Buch, ohne wirst du niemals etwas hinbekommen.
> Danach siehst du direkt was falsch ist und wie es richtig geht.

ja danke nochmal. ich hab grad ein buch über datentypen gelesen.

jetzt zufrieden? dann tschüß
Gast #3368393
Lesenswert?

koenig willy schrieb:
> o ein klugscheißer und wandele bitte NICHT den forum zu müll.
Oder du müllst das Forum mit einer Frage zu die jeder, der auch nur ein 
bisschen C kann, beantworten könnte.
> wenn du jemanden helfen willst, ja bitte , aber haste gar nix im kopf.
> nur diesen berühmten satz
>  "Lies ein C-Buch"
Das ist auch das einzig angebrachte bei dir. Ich könnte dir jetzt alles 
über Datentypen, integer, floats und casting erklären, aber wozu, denn 
das ist - wer hätte es gedacht - in jedem C-Buch erklärt. Dort kannst du 
es ebensogut nachlesen. Niemand hat Lust das gleiche immer und immer 
wieder den Anfängern zu erklären die sich zu fein sind es selber aus 
einem Buch herauszusuchen. Ein gewisses Mindestmaß an Eigeninitiative 
kann man von einem werdenden Programmierer erwarten, und ein 
Einsteigerbuch zu lesen fällt definitiv darunter. So lernst du am 
shcnellsten und besten wie es richtig geht und musst nicht für jedes 
kleine Problem dumme Fragen stellen.
#3368396
Lesenswert?

Dr. Sommer schrieb:
> koenig willy schrieb:
>> o ein klugscheißer und wandele bitte NICHT den forum zu müll.
> Oder du müllst das Forum mit einer Frage zu die jeder, der auch nur ein
> bisschen C kann, beantworten könnte.
>> wenn du jemanden helfen willst, ja bitte , aber haste gar nix im kopf.
>> nur diesen berühmten satz
>>  "Lies ein C-Buch"
> Das ist auch das einzig angebrachte bei dir. Ich könnte dir jetzt alles
> über Datentypen, integer, floats und casting erklären, aber wozu, denn
> das ist - wer hätte es gedacht - in jedem C-Buch erklärt. Dort kannst du
> es ebensogut nachlesen. Niemand hat Lust das gleiche immer und immer
> wieder den Anfängern zu erklären die sich zu fein sind es selber aus
> einem Buch herauszusuchen. Ein gewisses Mindestmaß an Eigeninitiative
> kann man von einem werdenden Programmierer erwarten, und ein
> Einsteigerbuch zu lesen fällt definitiv darunter. So lernst du am
> shcnellsten und besten wie es richtig geht und musst nicht für jedes
> kleine Problem dumme Fragen stellen.

jajaja. Herr selbsternannter Doktor!

jetzt hör mal endlich auf. Ich bitte dich jetzt nicht hier irgendwas zu 
posten.
#3368966
Lesenswert?

koenig willy schrieb:
> Matthias schrieb:
>> koenig willy schrieb:
>>> t1 = (uint32_t)datas/0.3;
>>>
>>> ohne diese Berechnung blinken alle LEDs. USART printf alles
>>> funktioniert
>>
>> UDIV mit Divisor 0 wird einen DIVBYZERO Fault werfen.
>
> danke Matthias für die Antwort.
>
> mir ist das jetzt klar. danke nochmal

Echt?
Mir nicht.
Insbesonders wo da eine Division durch 0 sein soll.
#3369004
Lesenswert?

Karl Heinz Buchegger schrieb:
> koenig willy schrieb:
>> Matthias schrieb:
>>> koenig willy schrieb:
>>>> t1 = (uint32_t)datas/0.3;
>>>>
>>>> ohne diese Berechnung blinken alle LEDs. USART printf alles
>>>> funktioniert
>>>
>>> UDIV mit Divisor 0 wird einen DIVBYZERO Fault werfen.
>>
>> danke Matthias für die Antwort.
>>
>> mir ist das jetzt klar. danke nochmal
>
> Echt?
> Mir nicht.
> Insbesonders wo da eine Division durch 0 sein soll.

das Problem war , dass ich nicht wusste dass es ein fertiges lib für 
floating point unit gibt.
von allen sry ,wenn ich noob fragen gestellt habe.

ich dachte nur dass man mit den verfügbaren intxx_t zahlen formaten für 
32bit rechner stm32 so eine gleitkommazahlen double float mantisse 
exponenten rumbastelt.

schön dass man float double einfach nehmen kann.
1
uint32_t t1 , datas;
2
t1 = (uint32_t)datas/0.3; // war falsch.
3
t1 = (uint32_t)datas/(uint32)0.3; // war richtig controller rechnet ohne problem

bei allen  müsste ich so einen cast operator immer benutzen muss. 
gewöhnungsbedürftig.
Gast #3369025
Lesenswert?

koenig willy schrieb:
> das Problem war , dass ich nicht wusste dass es ein fertiges lib für
> floating point unit gibt.
Du brauchst keien Lib. Die FPU macht das. Du musst nur den float 
Datentyp verwenden.

koenig willy schrieb:
> ich dachte nur dass man mit den verfügbaren intxx_t zahlen formaten für
> 32bit rechner stm32 so eine gleitkommazahlen double float mantisse
> exponenten rumbastelt.
Was? Nochmal auf Deutsch. Oder Englisch. Integer sind Ganzzahlen, für 
Gleitkommazahlen musst du die Variable als float oder double 
deklarieren:
1
float x = 0.1; x = x * 0.3;

koenig willy schrieb:
> uint32_t t1 , datas;
Also deklarierst du als Integer.
> t1 = (uint32_t)datas/0.3; // war falsch.
Du castest einen Integer in einen Integer und teilst durch einen Float? 
Diese Zeile ist äquivalent zu
t1 = datas/0;

> t1 = (uint32_t)datas/(uint32)0.3; // war richtig controller rechnet ohne
> problem
Diese Zeile ist immer noch sinnlos, du convertierst immer noch einen 
Integer in einen Integer (machst also gar nichts) und teilst durch 0. 
Hättest du ein C-Buch gelesen wüsstest du dass die casts sinnlos sind 
und dass hier durch 0 geteilt wird. Aber zum Lesen bist du dir ja zu 
fein.
#3369032
Lesenswert?

koenig willy schrieb:

>>> mir ist das jetzt klar. danke nochmal
>>
>> Echt?
>> Mir nicht.
>> Insbesonders wo da eine Division durch 0 sein soll.
>

> t1 = (uint32_t)datas/(uint32)0.3; // war richtig controller rechnet ohne


Gratuliere.
Jetzt HAST du eine Division durch 0 draus gemacht.

Sorry, aber die anderen haben recht. Durch anlassbezogenes Erfragen von 
1/16-tel Wissen (normalerweise sage ich 1/8-tel Wissen, aber bei dir 
fehlts echt weit), hat noch niemand eine Programmierprache, geschweige 
denn C gelernt.
Gast #3369033
Lesenswert?

Macht Spass den Thread zu lesen :-)

Aber wo die Leute Recht haben, da haben sie Recht: lies verdammt nochmal 
ein C-Buch und maul nicht rum!!! Sollche Nullen wie dich sieht man hier 
jeden Tag, die glauben, dass sie ohne Ahnung besser sind als erfahrene 
Leute.

koenig willy schrieb:
> das Problem war , dass ich nicht wusste dass es ein fertiges lib für
> floating point unit gibt.

wer lesen und recherchieren kann, ist klar im Vorteil...

koenig willy schrieb:
> ich dachte nur dass man mit den verfügbaren intxx_t zahlen formaten für
> 32bit rechner stm32 so eine gleitkommazahlen double float mantisse
> exponenten rumbastelt.

Glauben und Wissen sind zwei Paar Schuhe. Erst Doku lesen und verstehen, 
dann "denken". Ausser du bist Informatiker. In diesem Fall spare dir 
lieber den Aufwand, denn das mit der hardwarenahen Programmierung wird 
nichts. Bei deiner Einstellung ganz sicher.

koenig willy schrieb:
> bei allen  müsste ich so einen cast operator immer benutzen muss.
> gewöhnungsbedürftig.

Schreibfaul auch noch? Na dann Prost...
Gast #3369061
Lesenswert?

koenig willy schrieb:
> an Dr. Sommer
> Ich bin nicht muttersprachler in deutscher sprache bin nämlich aus
> china.
Achso. Das war nicht offensichtlich. Und dann fragt man in einem 
deutschen Forum? Okay.
> reicht das nicht wenn ich in solcher de-sprachstufe schreibe?
Es ist gelegentlich schwer verständlich. Wenn du englisch besser kannst 
wäre das einfacher...

koenig willy schrieb:
> das war nur dummes beispiel. rein mathematisch sollte unendlich
> resultieren. wollte nur diesen cast operator deuten.
Integer können aber in C kein "unendlich" darstellen, floats schon - da 
du aber deine Variablen als Integer deklarierst kommt da irgend ein 
Unsinn an. Dein cast Operator bewirkt wie gesagt überhaupt nichts, da du 
einen Integer in einen Integer castest, also gar nichts tust.
#3369073
Lesenswert?

Dr. Sommer schrieb:
>  willy schrieb:
>> an Dr. Sommer
>> Ich bin nicht muttersprachler in deutscher sprache bin nämlich aus
>> china.
> Achso. Das war nicht offensichtlich. Und dann fragt man in einem
> deutschen Forum? Okay.

es ist verdammt ein schönes forum. leider gibt es haufen unfreundliche 
typen die voll genervt sind.

>> reicht das nicht wenn ich in solcher de-sprachstufe schreibe?
> Es ist gelegentlich schwer verständlich. Wenn du englisch besser kannst
> wäre das einfacher...
jaja, was ich hier in deutscher sprache geschrieben habe verstehen alle 
1000%
viele haben problemen mit fehlende buchstaben kommas. einfach 
unglaublich.

> koenig willy schrieb:
>> das war nur dummes beispiel. rein mathematisch sollte unendlich
>> resultieren. wollte nur diesen cast operator deuten.
> Integer können aber in C kein "unendlich" darstellen, floats schon - da
> du aber deine Variablen als Integer deklarierst kommt da irgend ein
> Unsinn an. Dein cast Operator bewirkt wie gesagt überhaupt nichts, da du
> einen Integer in einen Integer castest, also gar nichts tust.
Gast #3369075
Lesenswert?

Unsinn
>>t1 = (uint32_t)datas/(uint32)0.3; // war richtig controller rechnet
>>                                     ohne problem
Richtig
>Denn (uint32)0.3  ergibt 0.

Ich weiß dass es als unhöflich angesehen wird auf eine C-Referenz zu 
verweisen, aber das obige Problem ist sowohl Grundlagenwissen, als auch 
nicht, in einem kurzen Statement, zu erklären.
Gast #3369079
Lesenswert?

koenig willy schrieb:
> Dennis schrieb:
>> Macht Spass den Thread zu lesen :-)
>>
>> Aber wo die Leute Recht haben, da haben sie Recht: lies verdammt nochmal
>> ein C-Buch und maul nicht rum!!! Sollche Nullen wie dich sieht man hier
>> jeden Tag, die glauben, dass sie ohne Ahnung besser sind als erfahrene
>


> alle machen doch fehler. lasst diese ober lehrer-nummer.

Ich glaub du hast den Unterschied zwischen fload und integer immer noch 
nich verstanden.
alle machen maln Fehler sind aber nicht so Lernresistend wie du dich 
hier zum Besten gibst.
Das wollt ich nur mal loswerden.
#3369086
Lesenswert?

Zeuss schrieb:
> koenig willy schrieb:
>> Dennis schrieb:
>>> Macht Spass den Thread zu lesen :-)
>>>
>>> Aber wo die Leute Recht haben, da haben sie Recht: lies verdammt nochmal
>>> ein C-Buch und maul nicht rum!!! Sollche Nullen wie dich sieht man hier
>>> jeden Tag, die glauben, dass sie ohne Ahnung besser sind als erfahrene
>>
>
>
>> alle machen doch fehler. lasst diese ober lehrer-nummer.
>
> Ich glaub du hast den Unterschied zwischen fload und integer immer noch
> nich verstanden.
> alle machen maln Fehler sind aber nicht so Lernresistend wie du dich
> hier zum Besten gibst.
> Das wollt ich nur mal loswerden.

bin nicht informatiker und bin aus dem bereich elektrotechnik.
Kann mir kaum vorstellen wie du in elektrotechnik resistent bist.
Gast #3369097
Lesenswert?

Du solltesr schon zwischen den einzelnen Datentypen unterscheiden können 
.
Ich bin kein Informatiker .

Am besten wir lassen Dich das mal machen und dann schauste mal wie weit 
du mit deiner ÜBERHEBLICHEN ART KOMMST!!!
#3369099
Lesenswert?

Karl Heinz Buchegger schrieb:

> Sorry, aber die anderen haben recht. Durch anlassbezogenes Erfragen von
> 1/16-tel Wissen (normalerweise sage ich 1/8-tel Wissen, aber bei dir
> fehlts echt weit), hat noch niemand eine Programmierprache, geschweige
> denn C gelernt.

ich bin nicht informatiker bin aus e-technik bereich.

nur weil du halbwegs guten informatik wissen besitzt bist noch lange 
nicht in der lage jemanden etwas zu lehren. ich kenne viele informatiker 
die nicht mal eine spannungsteiler, oder motortreiber schaltung basteln 
kann. so eine bist du evtl.
#3369103
Lesenswert?

Zeuss schrieb:
> Du solltesr schon zwischen den einzelnen Datentypen unterscheiden können

> Ich bin kein Informatiker .
>
> Am besten wir lassen Dich das mal machen und dann schauste mal wie weit
> du mit deiner ÜBERHEBLICHEN ART KOMMST!!!

Unglaublich wie die Nachkommen von großer DEUTSCHER Nation in Kürze Zeit 
aussehen werden. So arrogant, wird dich nicht weit bringen.
#3369106
Lesenswert?

koenig willy schrieb:
> Karl Heinz Buchegger schrieb:
>
>> Sorry, aber die anderen haben recht. Durch anlassbezogenes Erfragen von
>> 1/16-tel Wissen (normalerweise sage ich 1/8-tel Wissen, aber bei dir
>> fehlts echt weit), hat noch niemand eine Programmierprache, geschweige
>> denn C gelernt.
>
> ich bin nicht informatiker bin aus e-technik bereich.

Das ist mir ehrlich gesagt völlig egal.
Wer programmieren will, muss sein Werkzeug (die Programmiersprache) 
beherrschen. Amateure ein bisschen weniger, Profis vollständig.

> nicht in der lage jemanden etwas zu lehren. ich kenne viele informatiker
> die nicht mal eine spannungsteiler, oder motortreiber schaltung basteln
> kann. so eine bist du evtl.

Stell dir vor. Ich bin Informatiker. Und ich habe mit den von dir 
genannten Problemen auf Amateurebene keine Probleme.

Um das ins rechte Licht zu rücken, da du ja Elektrotechniker bist. Deine 
Frage läuft letzten Endes darauf hinaus, an welchem Ende man einen 
Lötkolben anfassen muss. Datentypen und wie sie sich in Variablen bzw. 
arithmetischen Ausdrücken auswirken, sind das um und auf aller 
typisierten Sprachen. Und das sind heutzutage, ich würde mal schätzen, 
mehr als 80% aller Programmiersprachen.
Wir reden auch nicht von einem besonders schwierigem Themenkreis. Nein, 
wir reden von absoluten Grundlagen. Sozusagen: erste Kurseinheit, erste 
Stunde.

> nur weil du halbwegs guten informatik wissen besitzt
Komm, lass gut sein. Zum Informatiker fehlen dann ab diesem Basiswissen 
noch einmal mindestens 4 bis 5 Jahre, in denen es um Algorithmen und 
Grundtechniken geht. Wer in einer Programmiersprache ein wenig 
Radebrechten kann, ist noch lange kein Informatiker.
Nur weil jemand ein Heftpflaster richtig rum aufkleben kann, ist er noch 
lange kein Herzchirurg.
#3369109
Lesenswert?

koenig willy schrieb:
> nur weil du halbwegs guten informatik wissen besitzt bist noch lange
> nicht in der lage jemanden etwas zu lehren. ich kenne viele informatiker
> die nicht mal eine spannungsteiler, oder motortreiber schaltung basteln
> kann. so eine bist du evtl.

Täusch dich nicht in Karl-Heinz. Der kann einen Spannungsteiler 
berechnen und einen Motortreiber bauen.

Die meisten E-Techniker koennen programieren und wissen was ein 
float/double Datentype ist und was ein Integer. Die uC Programmierung 
ist eher eine Domaene der E-Techniker als der Informatiker.
#3369142
Lesenswert?

koenig willy schrieb:
> nochmal , float double kenne ich. ich wusste halt nicht ob dies schon
> für stm32 als lib implementiert ist.
> einfach hochskrollen und lesen.

Was meinst du wozu das F in der Typenbezeichnung steht?
Und wenn du float/double schon kennst warum benutzt du es da nicht von 
Anfang an? Bevor du hier so eine Frage gestellt hast, haetest du das 
schon vorher mal ausprobieren koennen. Einfach die Typen durch float 
ersetzt und einmal Compiler aufgerufen und schaun was rauskommt.
#3369157
Lesenswert?

Helmut Lenzen schrieb:
> koenig willy schrieb:
>> nochmal , float double kenne ich. ich wusste halt nicht ob dies schon
>> für stm32 als lib implementiert ist.
>> einfach hochskrollen und lesen.
>
> Was meinst du wozu das F in der Typenbezeichnung steht?
> Und wenn du float/double schon kennst warum benutzt du es da nicht von
> Anfang an? Bevor du hier so eine Frage gestellt hast, haetest du das
> schon vorher mal ausprobieren koennen. Einfach die Typen durch float
> ersetzt und einmal Compiler aufgerufen und schaun was rauskommt.

es ist nicht mal intel prozessor. nämlich stm32 , 32 bit . die weiss ich 
zumindest.
die datentypen sind für stm32 schon extra definiert in einem extra 
library. richtig?

float double sind in gcc für 64 bit prozessor ausgelegt. dachte ich .
evtl wie die anderen datentypen uint32_float so was in der art.
die sache habe ich kapiert.
wegen meiner missvertändnis will ich nicht weiter beleidigt werden.
Gast #3369162
Lesenswert?

koenig willy schrieb:
>> Die meisten E-Techniker koennen programieren und wissen was ein
>> float/double Datentype ist und was ein Integer.
> nochmal , float double kenne ich. ich wusste halt nicht ob dies schon
> für stm32 als lib implementiert ist.
> einfach hochskrollen und lesen.

Nein das Problem ist, das du das Problem nicht verstehst. Das hat nichts 
mit dem STM32 zu tun oder irgendeiner lib. Das ist C!

Zum Beweis am PC:
1
#include <stdio.h>
2
#include <stdint.h>
3

4
int main(void)
5
{
6
  uint32_t zahl = 2 / (uint32_t)0.3;
7
  printf("%u", zahl);
8
  
9
  return 0;
10
}
Beim Kompilieren wird dich der Kompiler schon wegen einer Division durch 
Null warnen. Wenn du das Programm startest stürzt es ab.

Nochmal uint32_t = Integer = Ganzzahl, keine Kommazahl!

Richtig ist:
1
#include <stdio.h>
2
#include <stdint.h>
3

4
int main(void)
5
{
6
  float zahl = 2 / 0.3f;
7
  printf("%f", zahl);
8
  
9
  return 0;
10
}

Ganz klar ein Grundlagendefizit!
#3369167
Lesenswert?

koenig willy schrieb:
> die datentypen sind für stm32 schon extra definiert in einem extra
> library. richtig?

float,double,int,char,long  sind in keiner Libray definiert. Die 
gehoeren zum Standardsprachumfang von C. Die muesten fast auf jedem C 
Compiler funktionieren (fast deshalb weil es auch C-Compiler gibt die 
kein Fliesskomma koennen, der GCC kann aber Fliesskomma).

koenig willy schrieb:
> float double sind in gcc für 64 bit prozessor ausgelegt

float ist auf dem Stm32 nur fuer 32Bits IEEE Format ausgelegt 
Hardwaremaessig.
Gast #3369168
Lesenswert?

koenig willy schrieb:
> es ist nicht mal intel prozessor. nämlich stm32 , 32 bit . die weiss ich
> zumindest.
Genauer ist es ein STM32F4 welcher ein Cortex-M4F ist welcher aus der 
ARMv7M-Familie ist.

koenig willy schrieb:
> die datentypen sind für stm32 schon extra definiert in einem extra
> library. richtig?
Nein. Der Compiler, hier ARM-GCC, implementiert die Basisdatentypen wie 
uint32_t und float direkt, dazu brauchts keine Library.

koenig willy schrieb:
> float double sind in gcc für 64 bit prozessor ausgelegt. dachte ich .
float ist "fast immer" eine 32bit-Floatingpoint Zahl, double 64bit 
(zumindest per Standard IEEE 754). Beim ARM-GCC ist das auch so.

koenig willy schrieb:
> wegen meiner missvertändnis will ich nicht weiter beleidigt werden.
Deswegen tut das auch keiner. Das ist wegen deiner Weigerung die 
absoluten Grundlagen zu lernen. Wenn ich einen Motortreiber bauen will 
nerve ich auch keine ETechniker wie das ohmsche Gesetz geht, welche 
Anschlüsse ein Transistor hat und wo man einen Lötkolben anfasst, das 
kann ich in jedem Grundlagenbuch selber nachlesen.
#3369179
Lesenswert?

Dr. Sommer schrieb:
> koenig willy schrieb:
>> es ist nicht mal intel prozessor. nämlich stm32 , 32 bit . die weiss ich
>> zumindest.
> Genauer ist es ein STM32F4 welcher ein Cortex-M4F ist welcher aus der
> ARMv7M-Familie ist.
>
> koenig willy schrieb:
>> die datentypen sind für stm32 schon extra definiert in einem extra
>> library. richtig?
> Nein. Der Compiler, hier ARM-GCC, implementiert die Basisdatentypen wie
> uint32_t und float direkt, dazu brauchts keine Library.
>
> koenig willy schrieb:
>> float double sind in gcc für 64 bit prozessor ausgelegt. dachte ich .
> float ist "fast immer" eine 32bit-Floatingpoint Zahl, double 64bit
> (zumindest per Standard IEEE 754). Beim ARM-GCC ist das auch so.
>
> koenig willy schrieb:
>> wegen meiner missvertändnis will ich nicht weiter beleidigt werden.
> Deswegen tut das auch keiner. Das ist wegen deiner Weigerung die
> absoluten Grundlagen zu lernen. Wenn ich einen Motortreiber bauen will
> nerve ich auch keine ETechniker wie das ohmsche Gesetz geht, welche
> Anschlüsse ein Transistor hat und wo man einen Lötkolben anfasst, das
> kann ich in jedem Grundlagenbuch selber nachlesen.

so wäre es viel freundlich. super schöne erste post von dir. und nicht 
ausrasten.
ich will nicht dass ich über deutschen schlecht rede.

an allen alles gute. ich werde nicht weiter so noob fragen stellen.
Gast #3369632
Lesenswert?

(a) Bin ich nicht angemeldet und schreibe immer als "dieser" Gast hier.
(b) Habe ich das dumpfe Gefühl, dass du einfach nur ein Troll bist. 
Alternativ komplett unfähig. Such dir ein neues Betätigungsfeld.
Gast #3369683
Lesenswert?

Moin,

find das alles eher lustig, hab ich im 3 oder 4 Post nicht geschrieben 
er soll sich mal "float" ansehen? Auf double bin ich nicht mehr 
gekommen, aber egal.
Nun sind es glaub ich 60 Posts und der TO (chinesisch oder nicht) hat 
das immernoch nicht umgesetzt und andere haben schon ein paar Zeilen mit 
float als Variablentypzuweisung geschrieben.
Naja, was soll's!
Da müssen wir dann aber nich drüber herfallen...einfach auslaufen 
lassen!

Gruß
dat
Beast
Gast #3369841
Lesenswert?

Hallo koenig willy

tausche

t1 = (uint32_t)datas/0.3;

gegen

t1 = ((uint32_t)datas * 10) / 3;

und schreibe, was da passiert.

don't mix double, float and int

Versuche Dein Programm mit Integer-Zahlen zu schreiben, also Zahlen ohne 
Punkt.
#3370036
Lesenswert?

Karl schrieb:
> Und die schöne FPU?

Die ruht sich aus und laest es sich gut gehen.

unbekannter ARM-User schrieb im Beitrag #3369841:
> Versuche Dein Programm mit Integer-Zahlen zu schreiben, also Zahlen ohne
> Punkt.

Warum? Dafuer hat der STM32F4 doch eine Gleitkommaunit auf dem Chip. 
Fuer nicht Gebrauch gibt es kein Geld zurueck. Immer dieser Zuckreflex 
wenn es um Fliesskomma geht.
Gast #3370087
Lesenswert?

Helmut Lenzen schrieb:
> unbekannter ARM-User schrieb im Beitrag #3369841:
>> Versuche Dein Programm mit Integer-Zahlen zu schreiben, also Zahlen ohne
>> Punkt.
>
> Warum? Dafuer hat der STM32F4 doch eine Gleitkommaunit auf dem Chip.
> Fuer nicht Gebrauch gibt es kein Geld zurueck. Immer dieser Zuckreflex
> wenn es um Fliesskomma geht.

Weil eine Integerberechnung deutlich schneller läuft und keine Probleme 
mit Rundungen hat.

Die Fließkommaunit setzt man nur ein, wenn es absolut unumgänglich ist.

Frank
#3370143
Lesenswert?

Frank schrieb:
> Weil eine Integerberechnung deutlich schneller läuft und keine Probleme
> mit Rundungen hat.

Die Fliesskommaeinheit vom Cortex ist bei Additionen und Multiplikation 
genauso schnell wie die Integereinheit. Aber wenn das eine Rolle spielen 
sollte haette man sowieso die falsche CPU ausgewaehlt. Normalerweise 
schaut die doch sowieso die meiste Zeit am Tag zum Fenster raus.
Gast #3370160
Lesenswert?

Helmut Lenzen schrieb:
> Aber wenn das eine Rolle spielen
> sollte haette man sowieso die falsche CPU ausgewaehlt. Normalerweise
> schaut die doch sowieso die meiste Zeit am Tag zum Fenster raus.

Wenn die CPU den ganzen Tag zum Fenster raus schaut, dann ist die total 
unterfordert, also auch falsche CPU ausgewählt :-)
#3370714
Lesenswert?

Frank schrieb:
> Weil eine Integerberechnung deutlich schneller läuft

Bei CPUs mit FPU ist das ist der Stand von vor gut 2 Jahrzehnten. Heute 
ist das in dieser Allgemeinheit nicht mehr zutreffend.

> und keine Probleme mit Rundungen hat.

Solange die Mantisse lang genug ist gibts keinen Grund für Rundung. 
Ausser bei der Division. Und bei der hängt es von der Art der Berechnung 
ab, welche Rundung sinnvoller ist.
Gast #3371153
Lesenswert?

Ein namhafter Hersteller von Automobilen den ich zufällig kenne sieht 
das ungefähr so: "float" bringt Performance (weniger Skalierungen, 
Prüfungen auf Überläufe etc.) und kostet Speicher. Insbesondere bei 
Kennfeldern ist letzteres deutlich zu merken. CPU ist Tricore oder PPC.

Außerdem ist das Ergebnis schneller brauchbar, weil die vielen 
Umrechnungen wegfallen und die SW-Entwickler weniger Fehler machen 
können.
(Und jetz komm' mir keiner mit sauberem Design und Schnittstellen und so 
einem "Kram", der bei gewachsenen Projekten immer Potenzial hat)

Allerdings reden wir hier auch von "Programmen" mit mehreren 
Mannjahrzehnten Umfang. Wer als Hobbyist unterwegs ist und beim STM32F4 
an eine Grenze stößt, macht evtl. was falsch.

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