Kysymys:
Onko pow (): lle vaihtoehtoinen vaihtoehto kuin kelluva?
user16841
2016-11-14 07:11:47 UTC
view on stackexchange narkive permalink

Olen tutkinut KIELIVIITTEET Arduino-verkkosivustolta, enkä löydä muuta kuin Float-arvoa, joka vastaa pow () -ominaisuutta puuttuu jotain suurta, mutta minua varten olen tunkeutunut! Löysin pow () FUNCTIONS-sarakkeesta Math-otsikon alla (kuten odotin), mutta siinä sanotaan, että molemmat parametrit, [base] ja [eksponentti] ovat molemmat (float). Ja matematiikan otsikossa on vain kuusi muuta merkintää; yksikään niistä ei näytä olevan kokonaisluku. Haluan vain luoda 2: n tehot käyttämällä eksponentteja välillä 0-10. Kuten 2 ^ 0 = 1 ja sitten 2 ^ 1 = 2, sitten 2 ^ 2 = 4 ja sitten 2 ^ 3 = 8, sitten 2 ^ 4 = 16 ja sitten 2 ^ 5 = 32, sitten 2 ^ 6 = 64, sitten 2 ^ 7 = 128, sitten 2 ^ 8 = 256, sitten 2 ^ 9 = 512, sitten 2 ^ 10 on 1024

Ainoa tapa, jolla uimareita käytetään toimi näin? Aloin tuntea olevani ristiriidassa todellisuuden kanssa ja olen itse laskenut lääkitykseni, mutta olen oikeassa siellä missä minun pitäisi olla. Haluan pyytää anteeksi etukäteen tästä törkeästä valvonnasta, jonka kanssa olen tuhlannut aikaa, mutta olen käynyt läpi kaikki yhdeksän sivua tunnisteita ja tehnyt koskaan hakuja, jotka voisin ajatella. Myönnän, etten ole viettänyt niin paljon aikaa, mutta olin varma, että tämä tulee olemaan vain viiden minuutin juttu!

Jos haluat lisätietoja kokonaisluvusta pow (), katso http://stackoverflow.com/questions/101439/the-most-efficient-way-to-implement-an-integer-based-power-function-powint-int. Käytä arvoja 2, käytä vain vuoroja.
Kaksi vastused:
Jason Clark
2016-11-14 07:43:28 UTC
view on stackexchange narkive permalink

Yleisessä tapauksessa @dat_ha: n vastaus on oikea, mutta on syytä huomata, että haluat aivan erityisen tapauksen ... kahden voiman. Koska tietokoneet käyttävät binaarista aritmeettista toimintaa, kahden toiminnon sisältävissä toiminnoissa on usein joitain pikavalintoja.

Numeron kertominen kahden voimalla voidaan suorittaa vasemmalla siirtotoiminnolla ( << ), joka kirjaimellisesti siirtää luvun binäärisen esityksen numeroita (eli bittejä) ) vasemmalle. Pohjassa 2 bittien siirtäminen yhdestä paikasta vasemmalle on sama kuin kertominen 2: lla, aivan kuten tukiasemassa 10 numeroiden siirtäminen yksi paikka vasemmalle on sama kuin kertominen 10: llä. Vasemman siirtymän operaattorin täydellinen selostus C ++: ssa , katso tämä vastaus pinon ylivuodosta.

On tärkeää huomata, että vasemmalle siirtyminen voi menettää tietoja; loppupäästä siirtyneet bitit menetetään. Koska tarvitset 2 - 10 tehoa, olet turvassa työskennellessäsi allekirjoitettujen kokonaislukujen kanssa, joiden Arduino Unossa enimmäisarvo on 2 ^ 15-1 .

Ottaen huomioon nämä varoitukset, tässä on toiminto, jolla lasketaan kahden potenssi näiden rajojen sisällä. Tämä on erittäin nopea koodi, koska vasen siirtotoiminto on hyvin matalatasoinen operaatio, eikä kertomista itse asiassa suoriteta.

  int pow2 (int p) {return 1 << p;}  
Virhe: Se voi nousta 2 ^ 32-1, jos käytät `allekirjoittamatonta pitkää`.
@DatHa kiitos, näytin kadottaneen sanan "allekirjoitettu" muokkauksen aikana. Kiinteä.
Se voi ohittaa arvon 2 ^ 32 - 1, jos käytät mielivaltaisen tarkan kokonaisluvun aritmeettista toteutusta
Haluaisin erityisesti tietää, miksi kokonaisluvun muuntamisen tulokset pow () -tuloksista EIVÄT toimi 2: n tehojen osalta. Minulle pow (2,3) palauttaa arvon 8.00, mutta kun int (8.00) palauttaa arvon 8 , int (pow (2,3)) palauttaa 7!
Dat Ha
2016-11-14 07:15:44 UTC
view on stackexchange narkive permalink

Se toimii int , double , long ja float kanssa. unsigned long ja unsigned int pitäisi myös toimia. Sinun ei tarvitse käyttää VAIN kellukkeita.

Toivottavasti se auttoi!

Syy, miksi yllä oleva vastaus toimii, johtuu siitä, että reaalilukujoukko (joka sisältää kelluvia osia) sisältää kokonaislukujoukon
@DatHanBag: Ja mikä vielä tärkeämpää, jokainen 32-bittinen kokonaisluku edustaa tarkalleen "kaksinkertaista". Itse asiassa, koska IEEE-liukuluku perustuu binaariseen mantissa / eksponentti-esitykseen, jokaisen 2: n voiman tulisi olla täsmällisesti edustettavissa myös yli 2 ^ 53: n (piste, jossa `` kaksois`` ei voi edustaa kaikkia mielivaltaisia ​​kokonaislukuja, 1 yksikkö viimeisessä mantissan paikka on suurempi kuin 1,0).
@PeterCordes Kyllä, tiesin sen. Ehkä minun olisi pitänyt sanoa "rajoitetut joukot" viitatessani arduinon float- ja kokonaislukujoukkoihin kommentissani vastauksesta
Tämä on jonkin verran pätevä vastaus yleiseen kysymykseen `pow ()`: n käyttämisestä kokonaisluvuille, mutta AFAICT arduinolla ei ole edes laitteiston liukulukua, joten se on kauhea vastaus. Luku `pow ()` -toteutus [kuten tämä] (http://stackoverflow.com/questions/101439/the-most-efficient-way-to-implement-an-integer-based-power-function-powint- int), joka kulkee log2 (n) -ajan kertomalla ja lisäämällä tuloksen keräämiseksi, suoritettaisiin melkein varmasti todennäköisesti paremmin, ja jättämättä mainitsematta, että bittisiirtymät toimivat 2: n voiman osalta, tämä on vain kauhea vastaus tähän kysymykseen.
@PeterCordes "joten se on kauhea vastaus". - suostui siihen, että se on eräänlainen heikkolaatuinen yksinkertainen vastaus. pow () on varmasti laskettavissa log2: ssä (n) - koulussa opittu yksinkertainen menetelmä (kerro numero itsestään tehoon ei ole niin tehokas). Voit tehdä sen paremmin Fourier-muunnoksella esimerkiksi todella isoille kokonaislukuille. Mutta ehkä OP hyväksyy ja pitää siitä.


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...