Optimalizacia konstantneho float vyrazu, was: C xc8
Zuffa Jan
ZuffaJ na cgc.sk
Středa Prosinec 6 13:25:48 CET 2017
1. deli sa len 1x pri inicialzacii takze tu nic neusetrim (ano, nasobenie je lacnejsie ale na druhej strane
zneprehladnuje kod) a pri inom SampleRate by sa chyba prejavila opat
chyba -0.00002 vo vysledku vlastne nevadi, pretoze spravny vypocet mal aj tak vypadat takto:
m_wRDSDecBy = (WORD)((fSymP / fSamPerSym)+0.5f);
V reale ma byt SampleRate vzdy nasobok 2375 co vsak nie vzdy je mozne a navyse
chyba > 1 sposobuje casty rozpad casovania symbolov
2. spoliehal som sa na IDE a vypis z printf. je potom zaujimave ze
DBGLOG(m_iDbgRDS, LVL_WARNING, "%d %f %f", m_wRDSDecBy, fSymP, fSamPerSym);
(vnutorne vola printf) vypise fSYmP raz ako 96.0000 a raz ako 95.99998
tu neverim ze by kompilator tuto premennu nejako manipuloval pretoze su na nej zavisle
formatovacie znaky.
V kazdom pripade je to zaujimave spravanie ktore ma riesenie ale nema vysvetlenie
(zatial) a stalo ma hodinu casu :)
j.
-----Original Message-----
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Miroslav Mraz
Sent: Wednesday, December 06, 2017 1:00 PM
To: hw-list na list.hw.cz
Subject: Re: Optimalizacia konstantneho float vyrazu, was: C xc8
Co zkusit něco jako
fSymP = (float)dwSampleRate * 0,000421053f; fSymP je pak asi tak 96,000084
1. násobit je levnější než dělit
2. přesně to nikdy nebude, zkuste si ta čísla faktorizovat.
Mrazík
Dne 6.12.2017 v 10:30 Zuffa Jan napsal(a):
> dwSampleRate je DWORD premenna funkcie a tak sa s nim dalej pracuje
> target x86 a prekladac od $MS.
> Dalsie detaily nepoviem lebo sa hanbim :) Otazka je ako napisat riadok
> fSymP = (float)dwSampleRate / 2375.0f; aby daval vzdy rovnaky
> vysledok. Kalkulacka mi hovori ze 228000/2375 je presne 96 napriek
> tomu je v fSymP 95.99998
>
> j.
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz Hw-list na list.hw.cz http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list