- Вложения
-
- pow.jpg
- (60.49 КБ) 87 скачиваний
Прошу помочь разобраться - кто хуже в школе учился я или МК?
[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4379623#p4379623"]...продемонстрируйте пожалуйста код, в котором pow(2,2); без костылей результат 4 дает.[/uquote]
- Реклама
- Сообщения: 12867
- Зарегистрирован: Сб дек 18, 2021 19:25:32
Симулятор? )
Результат аппаратнозависим.
Результат аппаратнозависим.
Arduino UNO, Arduino IDE v1.8.19
(Не "исправлено"
, "ошибки" есть в большей степени).
еще можно использовать: до ^6
И Ардуино тут не при чем, как писали коллеги.
(Не "исправлено"
---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="Martian",url="/forum/viewtopic.php?p=4379632#p4379632"]
Да блин...
я же написал - тип переменной uint16_t - двухбайтное, целое, беззнаковое.
Нет. Эта функция изначально такая в Си. Просто надо как-то помнить язык, ну и в случае непонятных результатов всегда обращать в первую очередь внимание на типы. Сколько граблей поломано даже с простым знаковое-беззнаковое, когда по ошибке не то взято. А плавающая точка это всегда источник счастия...[/uquote]Viper_Snake писал(а):Исходя из этого, если я не могу с помощью данной функции без костылей получить тот результат, который ожидается, имею полное право считать эту функцию ущербной.
Да блин...
Не важно чем все начнется. Важно чем кончится!
Лучше не использовать эту функцию. Есть много способов получить результат без использования pow.
Да, с математической стороны интересно.
Да, с математической стороны интересно.
Последний раз редактировалось veso74 Ср мар 01, 2023 21:10:42, всего редактировалось 1 раз.
- Реклама
[uquote="veso74",url="/forum/viewtopic.php?p=4379637#p4379637"]Arduino UNO, Arduino IDE v1.8.19
(Не "исправлено"
, "ошибки" есть в большей степени).
еще можно использовать: до ^6
И Ардуино тут не при чем, как писали коллеги.[/uquote]
Если мало памяти, всякие float и double лучше вовсе обходить стороной. На 328 меге можно особо не париться, там ее как у дурака фантиков. Мои ходовые камни это тини 13 и серия 24-84, вот там все гораздо интереснее.
(Не "исправлено"
---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, вот там все гораздо интереснее.
Не важно чем все начнется. Важно чем кончится!
Я согласен. ATtiny13A тоже любимый МК.
Но пока в теме мы не прокомментировали аппаратную часть ни разу. Пишем о математике и коде.
А например, сегодня на столе была экспериментальная установка на следующего МК в коллекцию, есть float(32), float(48), float(64), int32, int48, int64. Для меня это тоже интересно.
P.S. Пожалуйста, не цитируйте все сообщения.
Но пока в теме мы не прокомментировали аппаратную часть ни разу. Пишем о математике и коде.
А например, сегодня на столе была экспериментальная установка на следующего МК в коллекцию, есть float(32), float(48), float(64), int32, int48, int64. Для меня это тоже интересно.
P.S. Пожалуйста, не цитируйте все сообщения.
- Сообщения: 12867
- Зарегистрирован: Сб дек 18, 2021 19:25:32
[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4379646#p4379646"]Да блин...
я же написал - тип переменной uint16_t - двухбайтное, целое, беззнаковое.[/uquote] и? pow() имеет переопределение, работающее с uint16_t ? может хватит тупить-то?
нет никаких проблем с возведением в целую степень. мартышка и очки начинается. Функция кривая... ну сделай некриво 3.14^5.76
нет никаких проблем с возведением в целую степень. мартышка и очки начинается. Функция кривая... ну сделай некриво 3.14^5.76
Последний раз редактировалось Martian Ср мар 01, 2023 21:35:47, всего редактировалось 1 раз.
Прошу прощения за оверквотинг - с телефона не очень удобно редактировать пост. Ну насчет аппаратной части под рукой сейчас только 328.
Добавлено after 8 minutes 18 seconds:
[uquote="Martian",url="/forum/viewtopic.php?p=4379659#p4379659"]и? pow() имеет переопределение, работающее с uint16_t ? может хватит тупить-то?[/uquote]
Алилуйя! Функция принимает оба аргумента в виде double. А мужики то и не знают.
Добавлено after 8 minutes 18 seconds:
[uquote="Martian",url="/forum/viewtopic.php?p=4379659#p4379659"]и? pow() имеет переопределение, работающее с uint16_t ? может хватит тупить-то?[/uquote]
Алилуйя! Функция принимает оба аргумента в виде double. А мужики то и не знают.
Не важно чем все начнется. Важно чем кончится!
[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4379660#p4379660"]...Функция принимает оба аргумента в виде double. А мужики то и не знают.[/uquote]
написано черным по белому:
https://www.arduino.cc/reference/en/lan ... /math/pow/
написано черным по белому:
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.
- Сообщения: 12867
- Зарегистрирован: Сб дек 18, 2021 19:25:32
ну только один пока не знает. Остается теперь догадаться о типе результате.
[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. Что просили, то и получили. Сколько ещё надо демонстрировать?
[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. Что просили, то и получили. Сколько ещё надо демонстрировать?
Всего доброго.
Евгений.
Евгений.
Убрать оптимизацию. по умолчанию на макс.
[uquote="veso74",url="/forum/viewtopic.php?p=4379684#p4379684"]Убрать оптимизацию. по умолчанию на макс.[/uquote]Зачем же убрать-то? Топикстартер не указывал, что у него оптимизация выключена. А смысл языков высокого уровня в том и состоит, что если кто-то не умеет мыслить логически, то за него надо это делать, в том числе и производить оптимизацию. Я бы посмотрел, как топикстартер стал бы писать на асме возведение в степень (произвольную, разумеется). Особенно для 13-й тиньки, которую тут нахваливали и у которой нет команды умножения.
Всего доброго.
Евгений.
Евгений.
Господин EATS, я бы попросил вас немного гонор поубавить. В стартовом посте я лишь задал вопрос, почему функция возведения в степень из коробки делает вычисления отличные от ожидаемых, а так же уточнил, что раньше ею никогда не пользовался. И асм тут привязывать не надо - в данном разделе обсуждается язык программирования более высокого уровня. Понадобится на тини13 умножать - умножим, хотя с таким камнем проще без подобных операций обходится.
Не важно чем все начнется. Важно чем кончится!
[uquote="Eats",url="/forum/viewtopic.php?p=4380007#p4380007"]Зачем же убрать-то?[/uquote]
А затем, что при включенной никакого возведения в степень может и не быть... Если переменной в коде присвоено единственное значение, то компилятор вправе обойтись без рантайма. Что мы и наблюдаем...
А затем, что при включенной никакого возведения в степень может и не быть... Если переменной в коде присвоено единственное значение, то компилятор вправе обойтись без рантайма. Что мы и наблюдаем...
- Сообщения: 19496
- Зарегистрирован: Чт фев 20, 2014 18:57:55
[uquote="Viper_Snake",url="/forum/viewtopic.php?p=4379564#p4379564"]Никогда ею не пользовался, а тут потребовалось по быстрому бегущий огонек на трех регистрах сочинить для ребенка - решил его через степень двойки организовать от лени и на такие вилы напоролся. Программа примитивная до безобразия - считаем степень двойки от 0 до 23 и кормим три регистра результатом .[/uquote]
охтыжблин... нифига себе
охтыжблин... нифига себе
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
А то. Еще и Три регистра - потрошим четырехбайтную переменную. Байтораздирающее зрелище.охтыжблин... нифига себе
Добавлено after 1 minute 30 seconds:
[uquote="КРАМ",url="/forum/viewtopic.php?p=4380091#p4380091"][uquote="Eats",url="/forum/viewtopic.php?p=4380007#p4380007"]Зачем же убрать-то?[/uquote]
А затем, что при включенной никакого возведения в степень может и не быть... Если переменной в коде присвоено единственное значение, то компилятор вправе обойтись без рантайма. Что мы и наблюдаем...
А, кстати да. Переменная то не константой задавалась, а менялась в программе.
Не важно чем все начнется. Важно чем кончится!
- Сообщения: 12867
- Зарегистрирован: Сб дек 18, 2021 19:25:32
сдвиговый регистр как бэ сразу намекает на сдвиг 1 единички, просто изменяя счётчик цикла, куда уж ленивее и никаких переменных не надо...
Ну как бы да, но без экспериментов жить скучно. В свое время, при изучении TM1628 экспериментов по оптимизации работы с нею было очень много, пока наиболее быстрый и эффективный метод не был найден.сдвиговый регистр как бэ сразу намекает на сдвиг 1 единички, просто изменяя счётчик цикла, куда уж ленивее и никаких переменных не надо...
Добавлено after 1 minute 38 seconds:
Re: Прошу помочь разобраться - кто хуже в школе учился я или МК?
Кстати, кто будет с TM1628 работать - не верьте даташиту родному - она умеет матрицу кнопок 10x2 а не 8x2.
Не важно чем все начнется. Важно чем кончится!


