Int Berechnungen

OP #2533219
Lesenswert?

Hallo,
warum wird diese Berechnung falsch gemacht?


1
int iStep_Puls_Pause=0;
2
uint16_t iZeit_Puls_Pause=0;
3
uint16_t iZeit_Puls=0; 
4
uint16_t iZeit_Pause=0;     
5
uint16_t iSollwert=0;
6

7
int main(void)
8
{


1
while(1)
2
{
3
    
4

5
float fmemmSollwert=0;
6
    
7
fmemmSollwert= (100-((215/250)*100))+0,5; 
8
iSollwert=fmemmSollwert;
9
    
10
switch (iStep_Puls_Pause)
11
{
12

13
//Puls Pausenzeit berechnen
14
case(1):
15
iZeit_Puls_Pause = 100;
16
iZeit_Puls = ((iZeit_Puls_Pause/100)*iSollwert);
17
iZeit_Pause = iZeit_Puls_Pause - iZeit_Puls;
18
          
19
usart_write_int0(iZeit_Puls_Pause);
20
usart_write_int0(iZeit_Puls);
21
usart_write_int0(iSollwert);
22
usart_write_int0(iZeit_Pause);
23

24
iStep_Puls_Pause = 2;

Ergebnis auf USART:

100
100
100
0


iSollwert müsste doch 14 sein...

(100-((215/250)*100))+0,5 = 14.5

Nach int dann -> abrunden/schneiden = 14.
Gast #2533267
Lesenswert?

> float fmemmSollwert=0;
> fmemmSollwert= (100-((215/250)*100))+0,5;

Das wird - so lange nix Gegenteiliges angegeben (=> f Suffix bei 
funktionierender Lösung) - hauptsächlich in int  berechnet:

215/250 = 0
0*100 = 0
100-0 = 100
(float) 100 = 100.0
100.0 + 0.5 = 100.5
fmemmSollwert = 100.5
Gast #2533275
Lesenswert?

Rechnen mit Ganzzahlen:

Solche Ausdrücke (215/250)*100 = 85 rechnet man besser so (215*100)/250 
= 85. Wobei man im Einzelfall aufpassen muss, dass durch die 
Multiplikation kein Überlauf passiert.
Gast #2533276
Lesenswert?

Markus P. schrieb:
> weiss jetzt nur noch nicht ob es vielleicht schon
> b , an , und . in 0.5 gelgen haben kann, das probier ich grad nochmal
> aus...

also du kannst davon ausgehen dass es allein durch "215.0f/250.0f" 
funktionieren müsste.
Ob da 0.5 oder 0,5 steht , sollte hier keinen unterschied machen!
Noch nen Frage:
1
iZeit_Puls_Pause = 100;
2
iZeit_Puls = ((iZeit_Puls_Pause/100)*iSollwert);

Was soll das bringen?
das ergebnis ist doch immer:
1
iZeit_Puls = iSollwert;
#2533364
Lesenswert?

Markus P. schrieb:
> Krapao schrieb:
>> 215/250 = 0
>
> Eigentlich doch 0,85 deswegen ja auch erst float...

Nö.

Eigentlich 215/250 -> 0

215 ist ein int
250 ist ein int

Also wird int durch int dividiert.

Dass deine Variable auf der linken Seite der Zuweisung ein float ist, 
interessiert keinen.

http://www.mikrocontroller.net/articles/FAQ#Datentypen_in_Operationen

> fmemmSollwert= (100.0f-((215.0f/250.0f)*100.0f))+0.5f;
>
> das hat aber geholfen,

Ist aber Unsinn. Float Rechnen ist um mindestens den Faktor 30 langsamer 
als int rechnen. Formel ein wenig umstellen und schon gibts keine 
Probleme mehr.
Gast #2533467
Lesenswert?

Na = bindet halt stärker :)
Ergo wird Ausgewertet (und ich hoffe mich hier nicht zu vertun):
1) 215/250
2) 0 * 100
3) 100 - 0
4) 100 + 0
5) fmemmSollwert = 100 (+ Cast)
6) 5
Der Ausdruck ergibt also 5 -- aber die Zuweisung 100.0.

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