| Автор | Сообщение |
амиго Гость 193.19.*.*
|
Доброго времени суток!
Как проще всего в С извлечь квадратный корень с числа?
Естественно, желательно не затратив много на это времени. |
|
GarikBaza Новичок Сообщения: 664
|
Ручками, Алексей, ручками.
Чтото придумаем. Но быстро врядли |
|
Murka Профессор Сообщения: 2370
|
|
Vasil_ Забанен  Сообщения: 203
|
Напиши
#include
//Ну а потом, как Murka,
a=sqrt(b) ;
//Только учитывай размерность констант и целочисленность арифметики, т.е. что ты будешь получать в результате. Если введешь плавучку- сожрет половину флэшки. Хотя, у меня в 2313 влазила, если операций не много. |
|
Murka Профессор Сообщения: 2370
|
Вот отрыл наконец - то: Выгодский М.Я. - Справочник по элементарной математике (2006)
Добавлено 15.08.2008 16:45
Народ на ассемблере по этой методе считал, правда откуда первое приближение брал не знаю.
Binder1.pdf 416,93 КБ Скачано: 1321 раз(а)
|
|
GarikBaza Новичок Сообщения: 664
|
Murka, Это труднопереносимо на МК.
Лучше последовать совету Vasil_ |
|
Murka Профессор Сообщения: 2370
|
GarikBaza, Не спорю, но метода универсальна, может кому пригодится. |
|
Vasil_ Забанен  Сообщения: 203
|
Я тут из интересу пробежался поиском, вдруг и себе придется, тут и грек этот древний, и Ньютон и т.д.:
http://www.codenet.ru/progr/alg/sqrt.php
http://www.piter.com/chapt.phtml?id=978527200068
Не знаю, какой там алгоритм в ИАРе реализован, возможно переключение оптимизации по размеру кода/времени выполнения меняет и алгоритм. Но вот пример того, как в Си можно подключив соответсвующую библиотеку одной строчкой извлечь этот корень и не тратить время на написание кода и его отладку в ассемблере, а потратить это время на решение основной задачи. Конечно, может оно бы было и нтересно, в познавательном плане, но где его набрать, этого времени?. Тем более, вряд ли напишешь лучше, чем те, кто писал эту библиотеку  |
|
Murka Профессор Сообщения: 2370
|
Vasil_,  |
|
амиго Гость 193.19.*.*
|
Спасибо, за помощь!
Проблемма состоит, из решения вычисления нелинейной фунции или уравнения.
А именно вычисление результата происходит по закону параболы, но формула y=ax2, не совсем подходит.
А вот математической системой решение из трёх уравнений обьеденённіх в одну систему всё просчитуется как надо, но систему переложить для контролера...я не берусь даже, потому как точьно не влезу в память контролера, да и сложно.
Возможно Вы знаете решение проблемы по проще.
Задача.
Имеем число 200, результат должен быть 310,
имеем число 400, результат должен быть 915,
Данные принимают значение 1_800.
В общем своеобразный калькулятор.
Добавлено 16-08-2008 09:43
Попробую число разбить на два этапа. сначала вычислить 200==300, а потом вычислить другой формулой,остаток и прибавить. так наверное будет проще и быстрее. |
|
Vasil_ Забанен  Сообщения: 203
|
Ну так и написал бы, какя формула подходит.
Если данные принимают макс. значение 800, а выходные данные не превышают значение 65535, то можно набить таблицу 1600байт+1600 байт , итого 3200/1024= 3,1кБ памяти. |
|
амиго Гость 193.19.*.*
|
Vasil_, так, пересчётов как минимум надо выполнить три. И при этом совершенно разные данные и назначение.
И места дифицит... Только считать, y=(x*x)a+bx+c. Вот, такая формула близка, но всё, же чёто, точняк высчитать а.в.с , чтоб добится нужных результатов не выходит.
Приблизительно правильно, но не точьно. |
|
Vasil_ Забанен  Сообщения: 203
|
Трудно что то сказать, не видя всей задачи и как и что ты считаешь. Я уже повыше писал об этом, и об этом же- в ссылке повыше:
| Цитата: | Однако практика использования функции sqrt показала, что данная функция ведет себя совершенно различным способом для целочисленных и действительных аргументов.
Результат выполнения кода приведенного в примере 1 выглядит так:
sqrt(169)=13, sqrt(168)=12 |
т.е. 13*13=169 ,12*12=144 , может здесь собака порыта?
Если пересчетов несколько, нужно писать функцию(подпрограмму) решения квадратного уравнения, а данные в нее предавать, это сэкономит место. |
|
GarikBaza Новичок Сообщения: 664
|
А если подкоренное сдвинуть на 4 знака влево, а корень на 2 вправо, то можно добится приемлемой точности |
|
амиго Гость 193.19.*.*
|
Vasil_, , А этож тоже помоему один из видов нелинейного уравнения, и к стати гораздо более подходит мне,
Писать, полностью задачу, не хотца, тему захломлять, в кратце- я реализовал ЮСАЛС в своем приборе, но значения приближонные, как у рессиверов,
для рессиверов, приближения проходят и удовлетворительно юсалс работает, но прибор, должен высчитывать позицию спутника, по точнее хотяб с погрешностью 0,01град.
Но не как не 0,1 гр, как у рессиверах. Хотя сам мотор имеет шкалу 0,10/16, но всёж пересчёт по точнее, нужен.
GarikBaza, а, это то же самое выходит, что bx+c, получается, что зависить будет линейность...наверное.
В общем буду пробовать , отпишусь. |
|
Vasil_ Забанен  Сообщения: 203
|
амиго, еслиб я еще знал что такое ЮСАЛС , ну не занимаюсь я спктниковым ТВ . |
|
амиго Гость 193.19.*.*
|
Vasil_, а ты мне, это уже говорил, я потому и не пишу, чтоб не запутатся.
В принципе спасибо большое , за наведение на нужную цель и подсказки, реализовать, всё удалось.
Тему не закрываю, а предлагаю, всё же вести разговор о различных математических решениях в програмировании. Потому как понятно, что програмирование без математических знаний не возможно.
Прошу модераторов подумать, над созданием, тем. Где бы висели константы, таблицы, простейшие формулы . Это очень поможет начинающим,
К примеру, я до сих пор понятия не имею скоко мсек в секунде, я в таблицу глянул пересчитал и готово и на мой взгляд, это правильно,
мозги светлее. |
|
Vasil_ Забанен  Сообщения: 203
|
Основные формулы наверное в большинстве соответствующих справочников содержатся, ну вот: - только там Си в смысле СИ- Система Интернациональная:
avtor_neizvesten_formuly_fiziki.rar 63,67 КБ Скачано: 604 раз(а)
|
|
starko Гость 77.94.*.*
|
| амиго писал: | прибор, должен высчитывать позицию спутника, по точнее хотяб с погрешностью 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.*.*
|
starko, ты всё верно написал, но команда подаётся в шестнадцатиричном исчеслении. И 1 ГРАДУС, разбит на 16 ступеней.(по крайней мере, только при таком раскладе заработал правильно) т.е. на 16 частей. получается 0,16 что ли. Первоначально я то же отталкивался от 0,1 и нифига счёта не выходило, а как перешол на 0,16 всё поехало куды надо.
Точьность согласен, что округлял до десятых, что до сотых, немного точьнее становится на крайних завалах Ямал 90 и амос,
Но, ты учитывай, что формула не простая для вичитания данных относительно точьки установки. Если везде понемножечьку сокрощать, то в конце концов оконьчательный результат обрезается по самые уши. И мотор едит приблизительно...поэтому я и задумал, по точьнее считать. В конце результат наиьолее приближонный и точный. Хотя обрезков после запятой не мало.
была у меня одна задумка, по юсалсу, но для реализации нужно было, чтоб дёрнув мотором и вернувшись назат, мотор по точьнее стал на место...но задумка, отпала по ряду причин. |
|
starko Гость 77.94.*.*
|
амиго, ты бы расписал подробнее задачу, а там что-то и придумали бы, как делать вычисления.
Полновесная математика, хоть и двухбайтная, тяжеловата для МК. Таблицы лучше, но если мало места, можно использовать однобайтные таблицы и интерполяцию. |
|
slav0n Забанен  Сообщения: 2252
|
Формула ЮЗАЛС:
Зачем мудрить с корнями ?!  |
|
GarikBaza Новичок Сообщения: 664
|
slav0n, и сколько ЭТО займет места в меге? Явно не 1кб, а влезли, в 400 байт . Эта формула висит на всех сайтах. Но чего-то в ней нехватает. Если кто-то скажет чего, - получит пончик |
|
slav0n Забанен  Сообщения: 2252
|
| GarikBaza писал: | | и сколько ЭТО займет места в меге? Явно не 1кб |
Ну вам то критично, и надо изголяться
А нафига мне это в мегу пихать?! |
|
GarikBaza Новичок Сообщения: 664
|
Надо было
Но пончик ждет своего съедателя  |
|
slav0n Забанен  Сообщения: 2252
|
| GarikBaza писал: | Но пончик ждет своего съедателя  |
щяз галодных нету
усе хитрые пошли тож ждут  |
|
амиго Гость 193.19.*.*
|
Позиция может быть восточной долготы, или западной. Так же и долгота, установочная может быть как восточной, так и западной.
А учитывать то что шарик не совсем шарик, а приплюснутый, и нелинейное движение самой клюшки мотора...(парабора).
В формуле написано позиция...это что за число?
Простая формула, чёто я похожее, пробовал, лажа выходила, не попадал спутник. И жрало флеш не мерено...
Счас, всё чётко работает...только сам не пойму, чё оно работает и даже правильно...
Без синусов и косинусов.
Сча посчитаю, с реальеыми данными.
А корень, нужен был, для высчитывания гипотенузы прямоугольного треугольника.
И зделая я это так.
Фунция вертится, постоянно сравнивая результат перемноженя
i_=i*i;(возведение в квадрат)
if(i_>a){i--;............}else{i++;............};
При максимально приближонному результату, i выводим как результат. Фунция, работает не быстро, но зато мало места во флеши занимает. |
|
slav0n Забанен  Сообщения: 2252
|
амиго, Эта формула тебе никак не подойдет. Занимает она около 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.*.*
|
slav0n, я только в иаре работаю и на С. Остальные компилеры меня не интересуют.
Зайди на мой сайт, оставь мне свой тф. |
|
Vasil_ Забанен  Сообщения: 203
|
амиго,компиляторы Си позволяют делать ассемблерные вставки вроде как приведенный код slav0n, берешь и копи/пасте в листинг.
Директивы прекомпилятору
#asm
#endasm
означают, что он должен оттранслировать код находящийся внутри , как ассемблерный.
Только вот, чтобы понимать, о чем вы говорите наверное таки придется знакомиться с ЮЗАЛС  |
|
амиго Гость 193.19.*.*
|
Vasil_, , Василий, Не нужно его изучать. Это просто и уже решено, идём дальше!
Я знаю, асмой пользуюсь. в иаре. |
|
slav0n Забанен  Сообщения: 2252
|
| Vasil_ писал: |
Только вот, чтобы понимать, о чем вы говорите наверное таки придется знакомиться с ЮЗАЛС  |
Идея ЮЗАЛС в том, что на основании географических координат места установки спутниковой антенны и угловой позиции спутника на геостационарной орбите, вычисляется угол поворота полярной подвески спутниковой антенны, для наведения её на соответствующий спутник, из точки с соответствующими географическими координатами. Во как!  |
|
|
Текущий раздел»
Программное обеспечение»
Микроконтроллеры (Микроконтроллеры - AVR-ы, PIC-и и другие)
|
|
|