Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Ср мар 01, 2023 20:45:44

...продемонстрируйте пожалуйста код, в котором pow(2,2); без костылей результат 4 дает.
Вложения
pow.jpg
(60.49 KiB) Скачиваний: 53

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Ср мар 01, 2023 20:47:47

Симулятор? )
Результат аппаратнозависим.

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Ср мар 01, 2023 20:49:44

Arduino UNO, Arduino IDE v1.8.19
(Не "исправлено" :), "ошибки" есть в большей степени).
10^0 = 1.00
10^1 = 10.00
10^2 = 100.00
10^3 = 1000.00
10^4 = 10000.00
10^5 = 99999.98
10^6 = 999999.68
10^7 = 9999984.00

---
еще можно использовать: до ^6
Код:
  for (byte i = 0; i < 8; i++) {
...   
    float z = pow(10, i);
    long j = (long)round(z);
...

10^0 = 1
10^1 = 10
10^2 = 100
10^3 = 1000
10^4 = 10000
10^5 = 100000
10^6 = 1000000
10^7 = 9999984

А лучше (мало памят) и точно: с циклом, с умножением.
И Ардуино тут не при чем, как писали коллеги.

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Ср мар 01, 2023 21:03:22

Viper_Snake писал(а):Исходя из этого, если я не могу с помощью данной функции без костылей получить тот результат, который ожидается, имею полное право считать эту функцию ущербной.
Нет. Эта функция изначально такая в Си. Просто надо как-то помнить язык, ну и в случае непонятных результатов всегда обращать в первую очередь внимание на типы. Сколько граблей поломано даже с простым знаковое-беззнаковое, когда по ошибке не то взято. А плавающая точка это всегда источник счастия...


Да блин... :facepalm: я же написал - тип переменной uint16_t - двухбайтное, целое, беззнаковое.

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Ср мар 01, 2023 21:07:38

Лучше не использовать эту функцию. Есть много способов получить результат без использования pow.
Да, с математической стороны интересно.
Последний раз редактировалось veso74 Ср мар 01, 2023 21:10:42, всего редактировалось 1 раз.

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Ср мар 01, 2023 21:10:32

Arduino UNO, Arduino IDE v1.8.19
(Не "исправлено" :), "ошибки" есть в большей степени).
10^0 = 1.00
10^1 = 10.00
10^2 = 100.00
10^3 = 1000.00
10^4 = 10000.00
10^5 = 99999.98
10^6 = 999999.68
10^7 = 9999984.00

---
еще можно использовать: до ^6
Код:
  for (byte i = 0; i < 8; i++) {
...   
    float z = pow(10, i);
    long j = (long)round(z);
...

10^0 = 1
10^1 = 10
10^2 = 100
10^3 = 1000
10^4 = 10000
10^5 = 100000
10^6 = 1000000
10^7 = 9999984

А лучше (мало памят) и точно: с циклом, с умножением.
И Ардуино тут не при чем, как писали коллеги.


Если мало памяти, всякие float и double лучше вовсе обходить стороной. На 328 меге можно особо не париться, там ее как у дурака фантиков. Мои ходовые камни это тини 13 и серия 24-84, вот там все гораздо интереснее.

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Ср мар 01, 2023 21:13:16

Я согласен. ATtiny13A тоже любимый МК.
Но пока в теме мы не прокомментировали аппаратную часть ни разу. Пишем о математике и коде.
А например, сегодня на столе была экспериментальная установка на следующего МК в коллекцию, есть float(32), float(48), float(64), int32, int48, int64. Для меня это тоже интересно.
P.S. Пожалуйста, не цитируйте все сообщения.

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Ср мар 01, 2023 21:32:13

Да блин... :facepalm: я же написал - тип переменной uint16_t - двухбайтное, целое, беззнаковое.
и? pow() имеет переопределение, работающее с uint16_t ? может хватит тупить-то?

нет никаких проблем с возведением в целую степень. мартышка и очки начинается. Функция кривая... ну сделай некриво 3.14^5.76
Последний раз редактировалось Martian Ср мар 01, 2023 21:35:47, всего редактировалось 1 раз.

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Ср мар 01, 2023 21:42:18

Прошу прощения за оверквотинг - с телефона не очень удобно редактировать пост. Ну насчет аппаратной части под рукой сейчас только 328.

Добавлено after 8 minutes 18 seconds:
и? pow() имеет переопределение, работающее с uint16_t ? может хватит тупить-то?

Алилуйя! Функция принимает оба аргумента в виде double. А мужики то и не знают.

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Ср мар 01, 2023 21:49:08

...Функция принимает оба аргумента в виде double. А мужики то и не знают.

написано черным по белому:
https://www.arduino.cc/reference/en/lan ... /math/pow/
Syntax
pow(base, exponent)

Parameters
base: the number. Allowed data types: float.
exponent: the power to which the base is raised. Allowed data types: float.

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Ср мар 01, 2023 21:50:06

ну только один пока не знает. Остается теперь догадаться о типе результате.

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Ср мар 01, 2023 21:52:17

И, если не затруднит, продемонстрируйте пожалуйста код, в котором pow(2,2); без костылей результат 4 дает.
Дык демонстрировали ведь уже на предыдущей странице:
вот только что добавил в в свой проект на атмеге48 три ваших строчки и заказал delay(c)
uint16_t a = 2;
uint16_t b = 2;
uint16_t c = pow(a,b);
delay(c);
и вот что ардуина 1.8.13 мне накомпилировала:
ldi r22, 0x04 ; 4
ldi r23, 0x00 ; 0
ldi r24, 0x00 ; 0
ldi r25, 0x00 ; 0
rcall .-1574 ; 0x1c6 <delay>

Без объявления float ардуина сгенерировала целочисленный результат, равный 4. Что просили, то и получили. Сколько ещё надо демонстрировать?

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Ср мар 01, 2023 22:05:30

Убрать оптимизацию. по умолчанию на макс.

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Чт мар 02, 2023 14:02:50

Убрать оптимизацию. по умолчанию на макс.
Зачем же убрать-то? Топикстартер не указывал, что у него оптимизация выключена. А смысл языков высокого уровня в том и состоит, что если кто-то не умеет мыслить логически, то за него надо это делать, в том числе и производить оптимизацию. Я бы посмотрел, как топикстартер стал бы писать на асме возведение в степень (произвольную, разумеется). Особенно для 13-й тиньки, которую тут нахваливали и у которой нет команды умножения.

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Чт мар 02, 2023 15:17:24

Господин EATS, я бы попросил вас немного гонор поубавить. В стартовом посте я лишь задал вопрос, почему функция возведения в степень из коробки делает вычисления отличные от ожидаемых, а так же уточнил, что раньше ею никогда не пользовался. И асм тут привязывать не надо - в данном разделе обсуждается язык программирования более высокого уровня. Понадобится на тини13 умножать - умножим, хотя с таким камнем проще без подобных операций обходится.

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Чт мар 02, 2023 16:54:02

Зачем же убрать-то?

А затем, что при включенной никакого возведения в степень может и не быть... Если переменной в коде присвоено единственное значение, то компилятор вправе обойтись без рантайма. Что мы и наблюдаем... :tea:

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Чт мар 02, 2023 19:54:44

Никогда ею не пользовался, а тут потребовалось по быстрому бегущий огонек на трех регистрах сочинить для ребенка - решил его через степень двойки организовать от лени и на такие вилы напоролся. Программа примитивная до безобразия - считаем степень двойки от 0 до 23 и кормим три регистра результатом .

охтыжблин... нифига себе :)))

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Чт мар 02, 2023 20:00:57

охтыжблин... нифига себе :)))

А то. Еще и Три регистра - потрошим четырехбайтную переменную. Байтораздирающее зрелище. :)))

Добавлено after 1 minute 30 seconds:
Зачем же убрать-то?

А затем, что при включенной никакого возведения в степень может и не быть... Если переменной в коде присвоено единственное значение, то компилятор вправе обойтись без рантайма. Что мы и наблюдаем... :tea:


А, кстати да. Переменная то не константой задавалась, а менялась в программе.

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Чт мар 02, 2023 21:04:19

сдвиговый регистр как бэ сразу намекает на сдвиг 1 единички, просто изменяя счётчик цикла, куда уж ленивее и никаких переменных не надо...

Re: Прошу помочь разобраться - кто хуже в школе учился я или

Чт мар 02, 2023 23:21:16

сдвиговый регистр как бэ сразу намекает на сдвиг 1 единички, просто изменяя счётчик цикла, куда уж ленивее и никаких переменных не надо...

Ну как бы да, но без экспериментов жить скучно. В свое время, при изучении TM1628 экспериментов по оптимизации работы с нею было очень много, пока наиболее быстрый и эффективный метод не был найден.

Добавлено after 1 minute 38 seconds:
Re: Прошу помочь разобраться - кто хуже в школе учился я или МК?
Кстати, кто будет с TM1628 работать - не верьте даташиту родному - она умеет матрицу кнопок 10x2 а не 8x2.
Ответить