El problema es que la función pow
desafortunadamente solo se especifica para números de punto flotante. Y los números de punto flotante tienen inexactitud, vea esto .
Entonces, cuando haces 2 ^ 2 puede que no obtengas exactamente 4, pero tal vez 3.9999. Ese es el error real. Entonces 3.9999 - 1 es 2.9999. Cuando lo conviertas de nuevo a un tipo entero para imprimirlo en el puerto, se truncará a 2.
Para empezar, no debería utilizar el punto flotante para empezar, ya que el uso de números de punto flotante en los sistemas integrados es casi siempre un mal diseño. Sólo los programas que usan los cálculos de punto flotante ampliamente deberían necesitarlos. Por ejemplo, si realiza muchos cálculos de trigonometría, procesamiento de señales, lógica difusa, IA o aplicaciones de casos especiales similares.
¡En este caso, eligió la MCU equivocada por completo, ya que una MCU de 8 bits sin FPU en el chip será extremadamente ineficaz para procesar dichos cálculos! No es una PC.
Solo olvídate de los números flotantes. Es trivial escribir una versión entera de pow () usted mismo:
uint32_t intpow (uint32_t base, uint32_t exp)
{
uint32_t sum;
if(exp == 0)
{
sum = 1;
}
else
{
sum = base;
for(uint32_t i=1; i<exp; i++)
{
sum *= base;
}
}
return sum;
}
En caso de que no necesites grandes números, puedes optimizar un poco lo de arriba bajando a uint16_t
o uint8_t
, que tu MCU 8-bitter disfrutará mucho más. Y como se señaló en otras respuestas, cualquier cosa 2^x
podría resolverse con cambios de bits.
También, como se mencionó en otra respuesta, considere usar tablas de búsqueda con valores precalculados, si esa es una opción.