Strano comportamento della funzione pow()

Buondì,
sto provando a risolvere words2, e mentre stavo provando alcune cose ho notato una inconsistenza con la funzione pow() (sia con cmath che con math.h). Quando io provo a fare pow(26,0) mi restituisce 1, come dovrebbe essere; ma se faccio pow(26,1) mi esce 25. Anche con pow(26,2) esce 675 mentre dovrebbe uscire 676. Con pow(26,3) invece esce il valore giusto (17576). Con pow(26,4) ritorna lo stesso problema (esce 456975 invece di 456976). Cosa sta succedendo? La risoluzione dell’esercizio che ho in mente ha bisogno di avere potenze funzionanti.

Edit: risolto creando una funzione pow() scritta da me, senza utilizzare librerie. Mi piacerebbe comunque capire perché succede questo.

Ciao,
La funzione pow restituisce sempre un numero decimale (piu’ precisamente un float)
Se hai mai lavorato con i float ti renderai conto che spesso presentano delle imprecisioni trascurabili (se provi a scrivere banalmente 4.0 / 2.0 noterai che non e’ 2, bensi’ cose simili a 2.000000003 oppure 1.999999998)
Tuttavia quando fai il passaggio da float a int (o comunque da un tipo decimale a uno intero) si applica l’arrotondamento per difetto, indipendentemente dalla parte decimale (basta notare che 8 / 3 = 2)
Dunque un cast da float a int e’ sostanzialmente imprevedibile se il risultato atteso e’ intero, perche’ con un’imprecisione positiva ottieni il risultato atteso x, mentre in caso di imprecisione negativa avviene l’arrotondamento per difetto a x-1
Pero’ puoi aggiungere un piccolo delta da aggiungere che ti rende certo che il cast sara’ prevedibile, banalmente: int x = pow(26, y) + 0.001

Ps: (sono consapevole che ho scritto una risposta decisamente piu’ lunga del necessario, ma e’ in caso altre persone abbiano problemi con i float)

1 Mi Piace

Grazie mille, è molto utile! Siccome lavoro con interi terrò la mia funzione che lavora con interi.