Forum: Mikrocontroller und Digitale Elektronik STM32F4 Gleitkommazahl berechnet nicht


von Li W. (kwilly_d)


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

von GaffelK (Gast)


Lesenswert?

die"testzahl" ist als UNSIGNED INTEGER deklariert, und kann somit nur 
werte von 0-65535 annehmen, und keine kommazahlen.

bei testzahl1++ wird diese um eins erhöht, und nciht um 0.1.

Jan

von Li W. (kwilly_d)


Lesenswert?

wie deklariere ich gleitkomma zahl in stm32f4?

wenn ich testzahl1 = testzahl1*0.1; gebe steht der controller fest. 
macht gar nichts weiter. warum ist das so? sollte wenigstens testzahl 
mit 0 multiplizieren oder?

lg

: Bearbeitet durch User
von Andreas G. (beastyk)


Lesenswert?

Schau mal Richtung "float".

MfG
dat
Beast

von Dr. Sommer (Gast)


Angehängte Dateien:

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.

von Dr. Sommer (Gast)


Lesenswert?

koenig willy schrieb:
> wenn ich testzahl1 = testzahl1*0.1; gebe steht der controller fest.
Außerdem "steht" der Controller nicht, er führt nur diese eine Rechnung 
nicht so aus wie du denkst. Damit er wirklich stehen bleibt bzw. 
abstürzt musst du schon andere Dinge tun als Multiplikationen...

von Li W. (kwilly_d)


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****/

von Li W. (kwilly_d)


Lesenswert?

ich habe zumindest erwartet dass die LEDs weiter toggeln.

von Dr. Sommer (Gast)


Lesenswert?

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.

von Li W. (kwilly_d)


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.

von Dr. Sommer (Gast)


Lesenswert?

koenig willy schrieb:
> ohne diese Berechnung blinken alle LEDs. USART printf alles
> funktioniert.
Lies ein C-Buch. Und ARM GCC: FPU der Cortex-M4F nutzen.

von Li W. (kwilly_d)


Lesenswert?

Dr. Sommer schrieb:
> koenig willy schrieb:
>> ohne diese Berechnung blinken alle LEDs. USART printf alles
>> funktioniert.
> Lies ein C-Buch. Und ARM GCC: FPU der Cortex-M4F nutzen.

danke für die zahlreiche vorschläge.

FPU ist schon eingeschaltet. system_stm32f4xx.c ist schon implementiert.

das ist auf keinen fall der grund warum der controller weiter nichts 
macht.

von Dr. Sommer (Gast)


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.

von Li W. (kwilly_d)


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üß

von Dr. Sommer (Gast)


Lesenswert?

koenig willy schrieb:
> ich hab grad ein buch über datentypen gelesen.
>
> jetzt zufrieden? dann tschüß
Dann hast du dein Problem ja gefunden und alles ist gut; tschüss.

von Li W. (kwilly_d)


Lesenswert?

Dr. Sommer schrieb:
> koenig willy schrieb:
>> ich hab grad ein buch über datentypen gelesen.
>>
>> jetzt zufrieden? dann tschüß
> Dann hast du dein Problem ja gefunden und alles ist gut; tschüss.

so ein ideot.

von Dr. Sommer (Gast)


Lesenswert?

koenig willy schrieb:
> so ein ideot.
Sagt der Beratungs & Lern-Resistente.

von Li W. (kwilly_d)


Lesenswert?

Dr. Sommer schrieb:
> koenig willy schrieb:
>> so ein ideot.
> Sagt der Beratungs & Lern-Resistente.

so ein klugscheißer und wandele bitte NICHT den forum zu müll.

wenn du jemanden helfen willst, ja bitte , aber haste gar nix im kopf. 
nur diesen berühmten satz
 "Lies ein C-Buch"

von Dr. Sommer (Gast)


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.

von Li W. (kwilly_d)


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.

von Svenska (Gast)


Lesenswert?

Dumm nur, dass er in diesem Fall durchaus im Recht ist.

von Li W. (kwilly_d)


Lesenswert?

Svenska schrieb:
> Dumm nur, dass er in diesem Fall durchaus im Recht ist.

schnell den name ändern for vote xD und schön anonym bleiben.

von Matthias (Gast)


Lesenswert?

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.

von Li W. (kwilly_d)


Lesenswert?

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

von kaiser willy (Gast)


Lesenswert?

koenig willy schrieb:
> schnell den name ändern for vote xD und schön anonym bleiben.

Heute frisch angemeldet und schon dicke Backe. Das ist Rekord!

von Li W. (kwilly_d)


Lesenswert?

kaiser willy schrieb:
> koenig willy schrieb:
>> schnell den name ändern for vote xD und schön anonym bleiben.
>
> Heute frisch angemeldet und schon dicke Backe. Das ist Rekord!

danke dass du es anmerkst. weiter so!

von Karl H. (kbuchegg)


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.

von Li W. (kwilly_d)


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.

von Helmut L. (helmi1)


Lesenswert?

koenig willy schrieb:
> t1 = (uint32_t)datas/(uint32)0.3; // war richtig controller rechnet ohne
> problem

So? Was rechnet er denn da aus? Bei mir kommt da eine Division durch 0 
raus.
Denn (uint32)0.3  ergibt 0.

von Dr. Sommer (Gast)


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.

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Dennis (Gast)


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...

von Li W. (kwilly_d)


Lesenswert?

an Dr. Sommer
Ich bin nicht muttersprachler in deutscher sprache bin nämlich aus 
china. reicht das nicht wenn ich in solcher de-sprachstufe schreibe? 
musst du noch schreiben
"LIES ein DEUTSCH BUCH"

von Li W. (kwilly_d)


Lesenswert?

Helmut Lenzen schrieb:
> koenig willy schrieb:
>> t1 = (uint32_t)datas/(uint32)0.3; // war richtig controller rechnet ohne
>> problem
>
> So? Was rechnet er denn da aus? Bei mir kommt da eine Division durch 0
> raus.
> Denn (uint32)0.3  ergibt 0.

das war nur dummes beispiel. rein mathematisch sollte unendlich 
resultieren. wollte nur diesen cast operator deuten.

von Dr. Sommer (Gast)


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.

von Li W. (kwilly_d)


Lesenswert?

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.

von Li W. (kwilly_d)


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.

von Amateur (Gast)


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.

von Zeuss (Gast)


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.

von Li W. (kwilly_d)


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.

von Zeuss (Gast)


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!!!

von Li W. (kwilly_d)


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.

von Li W. (kwilly_d)


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.

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Helmut L. (helmi1)


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.

von Li W. (kwilly_d)


Lesenswert?

super. viele sind voll mit schönen deutschen emmotionen aufgeladen. und 
nochmal neuartige typisch deutsch.
alles gute schönes deutschland.

von Li W. (kwilly_d)


Lesenswert?

> 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.

von Udo S. (urschmitt)


Lesenswert?

In der Zeit, in der du die ganzen unnötigen Posts hier geschrieben hast, 
hättest du schon die ersten beiden Kapitel vom Kernigham Ritchie 
durcharbeiten können.

von Helmut L. (helmi1)


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.

von Li W. (kwilly_d)


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.

: Bearbeitet durch User
von Christopher C. (Gast)


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!

von Helmut L. (helmi1)


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.

von Dr. Sommer (Gast)


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.

von Di P. (drpepper) Benutzerseite


Lesenswert?


von Li W. (kwilly_d)


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.

von (prx) A. K. (prx)


Lesenswert?

koenig willy schrieb:

> Ich bin nicht muttersprachler in deutscher sprache bin nämlich aus
> china. reicht das nicht wenn ich in solcher de-sprachstufe schreibe?

Wer in einem deutschen Forum in Deutsch schreibt, der wird automatisch 
mit deutschem Umgang konfrontiert. Und der ist erheblich direkter als in 
vielen anderen Kulturen, was Nichtdeutsche oft irritiert.

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Di Pi schrieb:
> rtfm:
> 
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0041c/ch03s02s02.html

Das bezieht sich auf ARM's eigenen Compiler, den armcc. Der TO verwendet 
aber den GCC.

von Di P. (drpepper) Benutzerseite


Lesenswert?

Dr. Sommer schrieb:
> Di Pi schrieb:
>> rtfm:
>>
> 
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0041c/ch03s02s02.html
>
> Das bezieht sich auf ARM's eigenen Compiler, den armcc. Der TO verwendet
> aber den GCC.

richtig, daher reiche ich unterwürfigst nach:
http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Primitive-Types

von unbekannter ARM-User (Gast)


Lesenswert?

Es gibt Tage da habe ich das Empfinden, dass das Niveau von 
mikrocontroller.net sehr gesunken ist. Heute ist schon wieder ein 
solcher.

von Svenska (Gast)


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.

von Andreas G. (beastyk)


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

von unbekannter ARM-User (Gast)


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.

von Karl (Gast)


Lesenswert?

Und die schöne FPU?

von Helmut L. (helmi1)


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.

von Frank (Gast)


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

von Helmut L. (helmi1)


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.

von Frank (Gast)


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 :-)

von (prx) A. K. (prx)


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.

: Bearbeitet durch User
von Karl (Gast)


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.

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.