Файлы  •  Ссылки  •  Прошивки  •  Правила  •  Архив  •   FAQ  •  Участники  •  Поиск
Регистрация  •  Вход

Извлечь корень числа в С

Список форумов» Программное обеспечение» Микроконтроллеры На страницу 1, 2  След.
АвторСообщение
амиго
Гость 193.19.*.*





14-08-2008 18:43

Доброго времени суток!
Как проще всего в С извлечь квадратный корень с числа?
Естественно, желательно не затратив много на это времени.
GarikBaza
Новичок
Сообщения: 664




14-08-2008 22:15

Ручками, Алексей, ручками.
Чтото придумаем. Но быстро врядли
Murka
Профессор
Сообщения: 2370




15-08-2008 02:11

а что sqrt() не катит?
Vasil_
Забанен
Забанен
Сообщения: 203




15-08-2008 08:01

Напиши
#include
//Ну а потом, как Murka,
a=sqrt(b) ;
//Только учитывай размерность констант и целочисленность арифметики, т.е. что ты будешь получать в результате. Если введешь плавучку- сожрет половину флэшки. Хотя, у меня в 2313 влазила, если операций не много.
Murka
Профессор
Сообщения: 2370




15-08-2008 16:43

Вот отрыл наконец - то: Выгодский М.Я. - Справочник по элементарной математике (2006)

Добавлено 15.08.2008 16:45

Народ на ассемблере по этой методе считал, правда откуда первое приближение брал не знаю.

  Binder1.pdf  416,93 КБ  Скачано: 1321 раз(а)

GarikBaza
Новичок
Сообщения: 664




15-08-2008 18:11

Murka, Это труднопереносимо на МК.
Лучше последовать совету Vasil_
Murka
Профессор
Сообщения: 2370




15-08-2008 21:23

GarikBaza, Не спорю, но метода универсальна, может кому пригодится.
Vasil_
Забанен
Забанен
Сообщения: 203




15-08-2008 21:30

Я тут из интересу пробежался поиском, вдруг и себе придется, тут и грек этот древний, и Ньютон и т.д.:
http://www.codenet.ru/progr/alg/sqrt.php
http://www.piter.com/chapt.phtml?id=978527200068
Не знаю, какой там алгоритм в ИАРе реализован, возможно переключение оптимизации по размеру кода/времени выполнения меняет и алгоритм. Но вот пример того, как в Си можно подключив соответсвующую библиотеку одной строчкой извлечь этот корень и не тратить время на написание кода и его отладку в ассемблере, а потратить это время на решение основной задачи. Конечно, может оно бы было и нтересно, в познавательном плане, но где его набрать, этого времени?. Тем более, вряд ли напишешь лучше, чем те, кто писал эту библиотеку подмигивание
Murka
Профессор
Сообщения: 2370




15-08-2008 22:01

Vasil_,
амиго
Гость 193.19.*.*





16-08-2008 09:34

Спасибо, за помощь!
Проблемма состоит, из решения вычисления нелинейной фунции или уравнения.
А именно вычисление результата происходит по закону параболы, но формула y=ax2, не совсем подходит.
А вот математической системой решение из трёх уравнений обьеденённіх в одну систему всё просчитуется как надо, но систему переложить для контролера...я не берусь даже, потому как точьно не влезу в память контролера, да и сложно.
Возможно Вы знаете решение проблемы по проще.
Задача.
Имеем число 200, результат должен быть 310,
имеем число 400, результат должен быть 915,
Данные принимают значение 1_800.

В общем своеобразный калькулятор.

Добавлено 16-08-2008 09:43

Попробую число разбить на два этапа. сначала вычислить 200==300, а потом вычислить другой формулой,остаток и прибавить. так наверное будет проще и быстрее.
Vasil_
Забанен
Забанен
Сообщения: 203




16-08-2008 15:42

Ну так и написал бы, какя формула подходит.
Если данные принимают макс. значение 800, а выходные данные не превышают значение 65535, то можно набить таблицу 1600байт+1600 байт , итого 3200/1024= 3,1кБ памяти.
амиго
Гость 193.19.*.*





16-08-2008 20:13

Vasil_, так, пересчётов как минимум надо выполнить три. И при этом совершенно разные данные и назначение.
И места дифицит... Только считать, y=(x*x)a+bx+c. Вот, такая формула близка, но всё, же чёто, точняк высчитать а.в.с , чтоб добится нужных результатов не выходит.
Приблизительно правильно, но не точьно.
Vasil_
Забанен
Забанен
Сообщения: 203




17-08-2008 07:23

Трудно что то сказать, не видя всей задачи и как и что ты считаешь. Я уже повыше писал об этом, и об этом же- в ссылке повыше:
Цитата:
Однако практика использования функции sqrt показала, что данная функция ведет себя совершенно различным способом для целочисленных и действительных аргументов.

Результат выполнения кода приведенного в примере 1 выглядит так:
sqrt(169)=13, sqrt(168)=12

т.е. 13*13=169 ,12*12=144 , может здесь собака порыта?
Если пересчетов несколько, нужно писать функцию(подпрограмму) решения квадратного уравнения, а данные в нее предавать, это сэкономит место.
GarikBaza
Новичок
Сообщения: 664




17-08-2008 11:48

А если подкоренное сдвинуть на 4 знака влево, а корень на 2 вправо, то можно добится приемлемой точности
амиго
Гость 193.19.*.*





17-08-2008 18:17

Vasil_, , А этож тоже помоему один из видов нелинейного уравнения, и к стати гораздо более подходит мне,
Писать, полностью задачу, не хотца, тему захломлять, в кратце- я реализовал ЮСАЛС в своем приборе, но значения приближонные, как у рессиверов,
для рессиверов, приближения проходят и удовлетворительно юсалс работает, но прибор, должен высчитывать позицию спутника, по точнее хотяб с погрешностью 0,01град.
Но не как не 0,1 гр, как у рессиверах. Хотя сам мотор имеет шкалу 0,10/16, но всёж пересчёт по точнее, нужен.
GarikBaza, а, это то же самое выходит, что bx+c, получается, что зависить будет линейность...наверное.
В общем буду пробовать , отпишусь.
Vasil_
Забанен
Забанен
Сообщения: 203




17-08-2008 20:53

амиго, еслиб я еще знал что такое ЮСАЛС , ну не занимаюсь я спктниковым ТВ недовольство, огорчение.
амиго
Гость 193.19.*.*





17-08-2008 21:11

Vasil_, а ты мне, это уже говорил, я потому и не пишу, чтоб не запутатся.

В принципе спасибо большое , за наведение на нужную цель и подсказки, реализовать, всё удалось.
Тему не закрываю, а предлагаю, всё же вести разговор о различных математических решениях в програмировании. Потому как понятно, что програмирование без математических знаний не возможно.
Прошу модераторов подумать, над созданием, тем. Где бы висели константы, таблицы, простейшие формулы . Это очень поможет начинающим,
К примеру, я до сих пор понятия не имею скоко мсек в секунде, я в таблицу глянул пересчитал и готово и на мой взгляд, это правильно,
мозги светлее.
Vasil_
Забанен
Забанен
Сообщения: 203




18-08-2008 06:37

Основные формулы наверное в большинстве соответствующих справочников содержатся, ну вот: - только там Си в смысле СИ- Система Интернациональная:

  avtor_neizvesten_formuly_fiziki.rar  63,67 КБ  Скачано: 604 раз(а)

starko
Гость 77.94.*.*





19-08-2008 05:21

амиго писал:
прибор, должен высчитывать позицию спутника, по точнее хотяб с погрешностью 0,01град.
Но не как не 0,1 гр, как у рессиверах. Хотя сам мотор имеет шкалу 0,10/16, но всёж пересчёт по точнее, нужен.

Ну, точность в принципе не мешает, только не понятно, зачем она нужна такая. При ширине ДН 2гр (тарель 0.9), пусть даже 1градус, зачем сотые доли?
Цитата:
сам мотор имеет шкалу 0,10/16
Популярнейший STRONG DM2100 (не утверждаю, что верх совершенства) имеет шаг приблизительно 0.1гр. Но это только шаг, точность позиционирования +-2-3шага. В каком моторе 0.10/16?
амиго
Гость 193.19.*.*





19-08-2008 11:00

starko, ты всё верно написал, но команда подаётся в шестнадцатиричном исчеслении. И 1 ГРАДУС, разбит на 16 ступеней.(по крайней мере, только при таком раскладе заработал правильно) т.е. на 16 частей. получается 0,16 что ли. Первоначально я то же отталкивался от 0,1 и нифига счёта не выходило, а как перешол на 0,16 всё поехало куды надо.
Точьность согласен, что округлял до десятых, что до сотых, немного точьнее становится на крайних завалах Ямал 90 и амос,
Но, ты учитывай, что формула не простая для вичитания данных относительно точьки установки. Если везде понемножечьку сокрощать, то в конце концов оконьчательный результат обрезается по самые уши. И мотор едит приблизительно...поэтому я и задумал, по точьнее считать. В конце результат наиьолее приближонный и точный. Хотя обрезков после запятой не мало.
была у меня одна задумка, по юсалсу, но для реализации нужно было, чтоб дёрнув мотором и вернувшись назат, мотор по точьнее стал на место...но задумка, отпала по ряду причин.
starko
Гость 77.94.*.*





20-08-2008 06:11

амиго, ты бы расписал подробнее задачу, а там что-то и придумали бы, как делать вычисления.
Полновесная математика, хоть и двухбайтная, тяжеловата для МК. Таблицы лучше, но если мало места, можно использовать однобайтные таблицы и интерполяцию.
slav0n
Забанен
Забанен
Сообщения: 2252




03-09-2008 02:04

Формула ЮЗАЛС:


Зачем мудрить с корнями ?! шок
GarikBaza
Новичок
Сообщения: 664




03-09-2008 18:18

slav0n, и сколько ЭТО займет места в меге? Явно не 1кб, а влезли, в 400 байт . Эта формула висит на всех сайтах. Но чего-то в ней нехватает. Если кто-то скажет чего, - получит пончик
slav0n
Забанен
Забанен
Сообщения: 2252




03-09-2008 18:58

GarikBaza писал:
и сколько ЭТО займет места в меге? Явно не 1кб

Ну вам то критично, и надо изголяться улыбка
А нафига мне это в мегу пихать?!
GarikBaza
Новичок
Сообщения: 664




03-09-2008 19:25

Надо было

недовольство, огорчение



Но пончик ждет своего съедателя ухмылка
slav0n
Забанен
Забанен
Сообщения: 2252




03-09-2008 22:15

GarikBaza писал:
Но пончик ждет своего съедателя ухмылка

щяз галодных нету улыбка
усе хитрые пошли помираю со смеху! тож ждут Облизываюсь ...
амиго
Гость 193.19.*.*





04-09-2008 22:10

Позиция может быть восточной долготы, или западной. Так же и долгота, установочная может быть как восточной, так и западной.
А учитывать то что шарик не совсем шарик, а приплюснутый, и нелинейное движение самой клюшки мотора...(парабора).
В формуле написано позиция...это что за число?
Простая формула, чёто я похожее, пробовал, лажа выходила, не попадал спутник. И жрало флеш не мерено...
Счас, всё чётко работает...только сам не пойму, чё оно работает и даже правильно... улыбка
Без синусов и косинусов.
Сча посчитаю, с реальеыми данными.

А корень, нужен был, для высчитывания гипотенузы прямоугольного треугольника.
И зделая я это так.
Фунция вертится, постоянно сравнивая результат перемноженя
i_=i*i;(возведение в квадрат)
if(i_>a){i--;............}else{i++;............};
При максимально приближонному результату, i выводим как результат. Фунция, работает не быстро, но зато мало места во флеши занимает.
slav0n
Забанен
Забанен
Сообщения: 2252




05-09-2008 00:59

амиго, Эта формула тебе никак не подойдет. Занимает она около 1,5кб флеши.

А вот так кодвижен вычисляет корень:
Код:
unsigned char isqrt(unsigned int x)
{
#asm
    ld   r26,y+
    ld   r27,y+
    clr    r30
   clr    r0
   ldi    r22,0x80
   clt
__isqrt0:
   mov    r1,r22
   lsr    r1
   ror    r0
   or    r1,r30
   brts __isqrt1
   cp    r26,r0
   cpc    r27,r1
   brcs __isqrt2
__isqrt1:
   sub    r26,r0
   sbc    r27,r1
   or    r30,r22
__isqrt2:
   bst    r27,7
   lsl    r26
   rol    r27
   lsr    r22
   brcc __isqrt0
   ret
#endasm
}

амиго
Гость 193.19.*.*





05-09-2008 19:22

slav0n, я только в иаре работаю и на С. Остальные компилеры меня не интересуют.
Зайди на мой сайт, оставь мне свой тф.
Vasil_
Забанен
Забанен
Сообщения: 203




05-09-2008 20:23

амиго,компиляторы Си позволяют делать ассемблерные вставки вроде как приведенный код slav0n, берешь и копи/пасте в листинг.
Директивы прекомпилятору
#asm
#endasm
означают, что он должен оттранслировать код находящийся внутри , как ассемблерный.
Только вот, чтобы понимать, о чем вы говорите наверное таки придется знакомиться с ЮЗАЛС улыбка
амиго
Гость 193.19.*.*





05-09-2008 20:42

Vasil_, , Василий, Не нужно его изучать. Это просто и уже решено, идём дальше! улыбка
Я знаю, асмой пользуюсь. в иаре.
slav0n
Забанен
Забанен
Сообщения: 2252




05-09-2008 21:20

Vasil_ писал:

Только вот, чтобы понимать, о чем вы говорите наверное таки придется знакомиться с ЮЗАЛС улыбка

Идея ЮЗАЛС в том, что на основании географических координат места установки спутниковой антенны и угловой позиции спутника на геостационарной орбите, вычисляется угол поворота полярной подвески спутниковой антенны, для наведения её на соответствующий спутник, из точки с соответствующими географическими координатами. Во как! гы-гы
Список форумов» Программное обеспечение» Микроконтроллеры» Извлечь корень числа в С На страницу 1, 2  След.
Перейти:  
Текущий раздел» Программное обеспечение» Микроконтроллеры (Микроконтроллеры - AVR-ы, PIC-и и другие)








Информация по ремонту для специалистов - справочники, инструкции, энциклопедия, советы и секреты ремонта,  настройка, сервисные режимы
Powered by phpBB 2.0.18 © 2001, 2002 phpBB Group!