Возведение в степень - глюк IDE

Nikomas

✩✩✩✩✩✩✩
25 Дек 2022
9
0
Очень интересную куртину наблюдаю: при возведении в степень в LOOP:
C++:
  uint8_t x;
  uint8_t y;
  uint8_t i;
void setup() {
  Serial.begin(9600);
}

void loop() {
  x = 2;
  y = 2;
  i = pow (x, y);
  Serial.println(i);
}
i = 3
А при возведении в степень в SETUP считает правильно. i = 4
C++:
  uint8_t x;
  uint8_t y;
  uint8_t i;
void setup() {
  x = 2;
  y = 2;
  i = pow (x, y);
  Serial.begin(9600);
  Serial.println(i);
}
void loop() {

}
 
Изменено:

Сотнег

★★★★★★★
15 Янв 2020
4,446
1,520

@Nikomas,
то, что оно равно трём - ну, бывает такое при отбрасывании дробной части.
Разные значения - да, забавно.

А нашли вы это как?
Вряд ли в квадрат таким способом что-то реально возводили...
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Возведение в степень скорее всего идет через логарифм, если вместо uint8_t взять float , то должно быть что то типа 3.999999
Не пробовал, типа догадка.
 
  • Лойс +1
Реакции: Nikomas

Nikomas

✩✩✩✩✩✩✩
25 Дек 2022
9
0
Избыточное цитирование. Отредактируй или сообщение будет удалено
если вместо uint8_t взять float , то должно быть что то типа 3.999999
Эво оно как бывает, Хотабыч. Действительно в симуляторе в 2х случаях = 4.00.

Но у меня потом может не пропустить такой тип данных библиотека WIRE при назначении значения пину.

Для чего все это. Я хочу обращаться к пинам MCP23017 напрямую через WIRE, ибо библиотека от ADAFRUIT не взлетела, а разбираться в ней нет желания. Лучше побитово включать светодиоды тем более что:
А0 = 20
А1 = 21
А2 = 22
...
А7 = 27

Отсюда:
C++:
float y;
double i;
...
void loop() {
    ...
    y = 0;
    i = pow (2, y);
    Wire.write(i);
    ++y;
    ...
}
ps Немного поиграл с типами данных результата и верный только при double и float.
 
Изменено:

Геннадий П

★★★★★★✩
14 Апр 2021
1,975
634
45
@Nikomas, Я через Wokwi проверял.

то должно быть что то типа 3.999999
Скорее всего так и есть, т.к. у pow исходные данные имеют float, а выход функции double. Нормальный компилятор докручивает до целого, а нерадивый тупо отбрасывает дробную часть.
pow() - Arduino Reference