Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Lukuarvojen skaalaminen

Sivun loppuun

dartvaneri [09.01.2013 14:15:32]

#

Osaisko joku heittää kaavan, jolla voidaan skaalata arvoja? Esimerkiksi tähän tyyliin:
0-1024 -> 0-99

Siis niin että, jos minulla on vaikka arvo 254 niin sen arvo pitäisi saada asteikolta 0-99 selville. Skaalautuminen tarvii olla lineaarista.

jlaire [09.01.2013 14:17:19]

#

x / 1024 * 99

Esimerkiksi 254 / 1024 * 99 ≈ 24,5566.

dartvaneri [09.01.2013 14:18:13]

#

Ai niinpä tietenki, kiitos! :)

Edit. Tosin joudun varmaan tekeen sillai, että ((x * 1000)/1024 * 99)/1000, koska
kieli on C ja alustana on Atmellin prossu, eikä se käsitykseni mukaan osaa laskea desimaalilukuja.

Jiffy [09.01.2013 14:25:45]

#

x*99/1024 vois toimia siistimmin

dartvaneri [09.01.2013 14:34:01]

#

Joo niin näköjään vois. Ehkä minunkin kannattais hetken miettiä ennen kuin suollan ulos paskaa. :D

User137 [09.01.2013 14:39:56]

#

Halusitko luvun ulos desimaalilukuna? Silloin:
x * 99.0 / 1024.0

dartvaneri [09.01.2013 14:54:21]

#

En tarvi, enkä voi käyttää desimaalilukuja.

Grez [09.01.2013 15:36:13]

#

dartvaneri kirjoitti:

alustana on Atmellin prossu

Btw, kai tossa on isommat kuin 16-bittiset kokonaisluvut? Muuten et saa koskaan yli 63 tulokseksi.

Mikrokontrollereiden kanssa tulee joskus myös tilanteita että potku ei riitä ilman optimointia. Silloin voi auttaa laittaa (x*99)>>10 tosin fiksu kääntäjä tehnee tuon muutenkin. Jos käytössä on 16-bittiset luvut niin sitten voi tehdä esim: (x>>1*99)>>9

Lebe80 [09.01.2013 15:49:15]

#

Onko muuten tarkoituksella 0-1024 -> 0-99, vai pitäisikö tuossa olla 0-1023 -> 0-99 tai vastaavasti 0-1024 -> 0-100 ?

Näyttävät niin oudoilta luvuilta, et veikkaan et dartvanerilla on jokin ajatuskatkos käynyt.

dartvaneri [09.01.2013 17:36:21]

#

Jep, ongelmaksi tosiaan tuli tuo 16-bittiset luvut.
Lebe80, joo tarkoitus oli tuo 0-1023.

Ongelman ratkaisuna oli seuraava kaava:
x*50/516
En sitten tiedä kumpi on järkeväpää, kikkailla tuolla vai tuolla Grez:n tavalla.

Grez [09.01.2013 18:07:34]

#

No en osaa tarkemmin sanoa kun en tiedä mikä Atmelin prossu on kyseessä, mutta varsinkin vähempitehoisissa jakolasku on hidas operaatio. Tuollaista /516 jakoa kääntäjä ei edes pysty optimoimaan.

dartvaneri [09.01.2013 18:10:07]

#

Okei, prossu on ATMega328.

Grez [09.01.2013 18:26:22]

#

Joo no toi x*50/516 vie noin 280 kellojaksoa kun taas (x>>1*99)>>9 noin 10-20 kellojaksoa. Eli jos koodin nopeudella on mitään väliä niin sitten tuo ehdotukseni on järkevämpi.

(Arviot perustuu tulkintaani Atmelin julkaisemista prossun spekseistä ja app noteista. Luvut saattaa siis heittää jonkin verran)

dartvaneri [09.01.2013 21:22:40]

#

Okkei. Täytynee perehtyä enempi noihin shift operaatiohin, jos vaikutus kuitenkin on noin suuri, ei se näin pienessä projektissa ole niin mahdoton, mutta jos joskus isompia tekee, niin merkitys kasvaa.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta