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

Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
veso74
Поставщик валерьянки для Кота
Сообщения: 1915
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4379623#p4379623"]...продемонстрируйте пожалуйста код, в котором pow(2,2); без костылей результат 4 дает.[/uquote]
Вложения
pow.jpg
(60.49 КБ) 82 скачивания
Реклама
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

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

Сообщение Martian »

Симулятор? )
Результат аппаратнозависим.
Реклама
veso74
Поставщик валерьянки для Кота
Сообщения: 1915
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

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
А лучше (мало памят) и точно: с циклом, с умножением.
И Ардуино тут не при чем, как писали коллеги.
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1050
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

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

Сообщение Viper_Snake »

[uquote="Martian",url="/forum/viewtopic.php?p=4379632#p4379632"]
Viper_Snake писал(а):Исходя из этого, если я не могу с помощью данной функции без костылей получить тот результат, который ожидается, имею полное право считать эту функцию ущербной.
Нет. Эта функция изначально такая в Си. Просто надо как-то помнить язык, ну и в случае непонятных результатов всегда обращать в первую очередь внимание на типы. Сколько граблей поломано даже с простым знаковое-беззнаковое, когда по ошибке не то взято. А плавающая точка это всегда источник счастия...[/uquote]

Да блин... :facepalm: я же написал - тип переменной uint16_t - двухбайтное, целое, беззнаковое.
Не важно чем все начнется. Важно чем кончится!
Реклама
Эиком - электронные компоненты и радиодетали
veso74
Поставщик валерьянки для Кота
Сообщения: 1915
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

Лучше не использовать эту функцию. Есть много способов получить результат без использования pow.
Да, с математической стороны интересно.
Последний раз редактировалось veso74 Ср мар 01, 2023 21:10:42, всего редактировалось 1 раз.
Реклама
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1050
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

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

Сообщение Viper_Snake »

[uquote="veso74",url="/forum/viewtopic.php?p=4379637#p4379637"]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
А лучше (мало памят) и точно: с циклом, с умножением.
И Ардуино тут не при чем, как писали коллеги.[/uquote]

Если мало памяти, всякие float и double лучше вовсе обходить стороной. На 328 меге можно особо не париться, там ее как у дурака фантиков. Мои ходовые камни это тини 13 и серия 24-84, вот там все гораздо интереснее.
Не важно чем все начнется. Важно чем кончится!
Реклама
veso74
Поставщик валерьянки для Кота
Сообщения: 1915
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

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

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

Сообщение Martian »

[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4379646#p4379646"]Да блин... :facepalm: я же написал - тип переменной uint16_t - двухбайтное, целое, беззнаковое.[/uquote] и? pow() имеет переопределение, работающее с uint16_t ? может хватит тупить-то?

нет никаких проблем с возведением в целую степень. мартышка и очки начинается. Функция кривая... ну сделай некриво 3.14^5.76
Последний раз редактировалось Martian Ср мар 01, 2023 21:35:47, всего редактировалось 1 раз.
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1050
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

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

Сообщение Viper_Snake »

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

Добавлено after 8 minutes 18 seconds:
[uquote="Martian",url="/forum/viewtopic.php?p=4379659#p4379659"]и? pow() имеет переопределение, работающее с uint16_t ? может хватит тупить-то?[/uquote]
Алилуйя! Функция принимает оба аргумента в виде double. А мужики то и не знают.
Не важно чем все начнется. Важно чем кончится!
veso74
Поставщик валерьянки для Кота
Сообщения: 1915
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4379660#p4379660"]...Функция принимает оба аргумента в виде double. А мужики то и не знают.[/uquote]
написано черным по белому:
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.
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

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

Сообщение Martian »

ну только один пока не знает. Остается теперь догадаться о типе результате.
Аватара пользователя
Eats
Потрогал лапой паяльник
Сообщения: 309
Зарегистрирован: Сб фев 18, 2023 21:51:01
Откуда: Санкт-Петербург

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

Сообщение Eats »

[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4379623#p4379623"]И, если не затруднит, продемонстрируйте пожалуйста код, в котором pow(2,2); без костылей результат 4 дает.[/uquote]Дык демонстрировали ведь уже на предыдущей странице:
[uquote="Eats",url="/forum/viewtopic.php?p=4379449#p4379449"]вот только что добавил в в свой проект на атмеге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>[/uquote]
Без объявления float ардуина сгенерировала целочисленный результат, равный 4. Что просили, то и получили. Сколько ещё надо демонстрировать?
Всего доброго.
Евгений.
veso74
Поставщик валерьянки для Кота
Сообщения: 1915
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

Убрать оптимизацию. по умолчанию на макс.
Аватара пользователя
Eats
Потрогал лапой паяльник
Сообщения: 309
Зарегистрирован: Сб фев 18, 2023 21:51:01
Откуда: Санкт-Петербург

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

Сообщение Eats »

[uquote="veso74",url="/forum/viewtopic.php?p=4379684#p4379684"]Убрать оптимизацию. по умолчанию на макс.[/uquote]Зачем же убрать-то? Топикстартер не указывал, что у него оптимизация выключена. А смысл языков высокого уровня в том и состоит, что если кто-то не умеет мыслить логически, то за него надо это делать, в том числе и производить оптимизацию. Я бы посмотрел, как топикстартер стал бы писать на асме возведение в степень (произвольную, разумеется). Особенно для 13-й тиньки, которую тут нахваливали и у которой нет команды умножения.
Всего доброго.
Евгений.
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1050
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

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

Сообщение Viper_Snake »

Господин EATS, я бы попросил вас немного гонор поубавить. В стартовом посте я лишь задал вопрос, почему функция возведения в степень из коробки делает вычисления отличные от ожидаемых, а так же уточнил, что раньше ею никогда не пользовался. И асм тут привязывать не надо - в данном разделе обсуждается язык программирования более высокого уровня. Понадобится на тини13 умножать - умножим, хотя с таким камнем проще без подобных операций обходится.
Не важно чем все начнется. Важно чем кончится!
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25386
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

[uquote="Eats",url="/forum/viewtopic.php?p=4380007#p4380007"]Зачем же убрать-то?[/uquote]
А затем, что при включенной никакого возведения в степень может и не быть... Если переменной в коде присвоено единственное значение, то компилятор вправе обойтись без рантайма. Что мы и наблюдаем... :tea:
Morroc
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

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

Сообщение Morroc »

[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4379564#p4379564"]Никогда ею не пользовался, а тут потребовалось по быстрому бегущий огонек на трех регистрах сочинить для ребенка - решил его через степень двойки организовать от лени и на такие вилы напоролся. Программа примитивная до безобразия - считаем степень двойки от 0 до 23 и кормим три регистра результатом .[/uquote]
охтыжблин... нифига себе :)))
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1050
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

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

Сообщение Viper_Snake »

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

Добавлено after 1 minute 30 seconds:
[uquote="КРАМ",url="/forum/viewtopic.php?p=4380091#p4380091"][uquote="Eats",url="/forum/viewtopic.php?p=4380007#p4380007"]Зачем же убрать-то?[/uquote]
А затем, что при включенной никакого возведения в степень может и не быть... Если переменной в коде присвоено единственное значение, то компилятор вправе обойтись без рантайма. Что мы и наблюдаем... :tea:[/uquote]

А, кстати да. Переменная то не константой задавалась, а менялась в программе.
Не важно чем все начнется. Важно чем кончится!
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

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

Сообщение Martian »

сдвиговый регистр как бэ сразу намекает на сдвиг 1 единички, просто изменяя счётчик цикла, куда уж ленивее и никаких переменных не надо...
Аватара пользователя
Viper_Snake
Электрический кот
Сообщения: 1050
Зарегистрирован: Вс мар 01, 2009 19:47:16
Откуда: Ростов-на-Дону

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

Сообщение Viper_Snake »

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

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

Вернуться в «Arduino»