Проблема с возведением в степень

osmos7
Offline
Зарегистрирован: 22.10.2012

Здравствуйте!

Есть код, который выдаёт 

int y=0;
int i=0;

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

void loop()
{
  for (int i=0; i<9; i++)
  {
      y=pow(2,i);
    Serial.print(i);
    Serial.print("   ");
    
    Serial.println(y);
    delay(1000 / 2); 
  }
}

выдаёт следующее 

0   1
1   2
2   3
3   7
4   15
5   31
6   63
7   127
8   255

 

Причем, тупо pow(2,2) даёт 4, pow(2,3) - 8 и т.д.

Есть идеи?

 

maksim
Offline
Зарегистрирован: 12.02.2012

 Ну прибавьте после 1 степени единицу и все получится )  Вот так вот оно округляется из double в int, обьявите так

double y = 0;

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Это проблеммы округления. То, ч что пишите «тупо», он использует byte, при округлении он отбрасыват дробную часть, а степень считает через экспоненту, а там операция деления. И еще. То, что пишите «тупо», он, скорее всего, считает еще при компиляции (оптимихирует).

osmos7
Offline
Зарегистрирован: 22.10.2012

Спасибо!

select2
Offline
Зарегистрирован: 31.10.2012

Функция POW очень ресурсоемкая. Я решал такую задачу проще.
код возводит 2 в степень bitnum:

  uint16_t bitmask = 1;
  if (bitnum >0) {
    for (int i = 0; i < bitnum; ++i) {                               // 
      bitmask <<= 1;