Arduino pow() делает девятки

Я временно теряю рассудок или не понимаю, как работает степенной метод, но когда я привожу 10 к степени числа, это значение равно -1. Итак:

10*10 = 100

Тогда я бы предположил, что 10^2 = 100

Итак, если бы у меня была переменная i, которая была бы равна 2, и я запросил у Arduino 10 в степени >i, я ожидал, что он выполнит 10^2, а затем выдаст мне 100, но вместо этого я получу 99. Что мне не хватает?

void setup() {
Serial.begin(9600);
}

void loop() {
for (int i =0; i<5; i++){
   int power = i;
   Serial.print(power);
   Serial.print(":");

   int multiplier = pow(10,power);
   Serial.println(multiplier);

  }

}

, 👍1

Обсуждение

^ не является степенным оператором в C и C++. это побитовое исключающее ИЛИ, @Juraj

https://stackoverflow.com/questions/4843304/why-is-my-power-operator-not-working, @Juraj


2 ответа


3

pow() работает с числами с плавающей запятой.

Числа с плавающей запятой — это всего лишь приближение. Очень редко можно получить точные результаты, используя числа с плавающей запятой.

Вместо этого вы можете написать свой собственный небольшой целочисленная функция ipow().

,

3

Я поместил этот код в IDE, и для n>=2 я получил 99, 999, 9999 и т. д. Загвоздка в том, что Arduino использует арифметику с плавающей запятой для реализации функции pow(), и некоторые из ваших значений усекается как целые числа. Если вы измените:

 int multiplier = pow(10,power);

в

 float multiplier = pow(10,power);

Результаты должны соответствовать ожиданиям.

(Краткая причина использования чисел с плавающей запятой связана с тем фактом, что функцию pow() очень легко вычислить с использованием журналов, и это позволяет легко вычислять и нецелые числа pow(). Это также означает, что она может быть не таким точным, как вы надеетесь).

,