avrasm

Do you have a question? Post it now! No Registration Necessary

Threaded View
                           Пpивет, All!


   Столкнулся с пакостью - не нравится avrasm-у несколько .def на один регистр.
Компилируется, но ругается предупреждениями. Это как-то можно обойти ? Ради
такой ерунды менять компилятор вроде как смысла нет (в остальном он меня
устраивает).

  Вопрос второй - а где-нибудь водится аккуратная "плавающая" библиотечка на
AVR ? 32-битная, 24-битная меня что-то совсем не привлекает... Или придется
самому писать ?

  И третий вопрос - хотелось бы найти формальное описание полиноминальной
аппроксимации (вот завернул ;) функций log(x) и exp(x). В библиотеке Hitech C
для PIC я их нашел, но с моим знанием C не сказать, чтобы вполне понял, как
именно это вычисляется. Hаверняка ведь где-нибудь есть подходящий справочник в
электронном виде ? Или нет ?

  Оно конечно, может быть, правильнее было бы сделать все на сях, но мне как-то
привычнее на .asm, тем более что все остальное вполне так просто и наглядно,
вот только немножко плавучки и эти две функции портят картину...

                                      с уважением Владислав


avrasm
Tue Jan 11 2005 23:18, Vladislav Baliasov wrote to All:

 
 VB> Вопрос второй - а где-нибудь водится аккуратная "плавающая" библиотечка
 VB> на AVR ? 32-битная, 24-битная меня что-то совсем не привлекает... Или
 VB> придется самому писать ?

 Почему бы не взять библиотеку от того же IAR ?

 VB> И третий вопрос - хотелось бы найти формальное описание полиноминальной
 VB> аппроксимации (вот завернул ;) функций log(x) и exp(x).

 Это очень просто. Сначала считаешь по основанию 2, потом переводишь
 к основанию e. Целая часть log2(x) это порядок х. Дробную часть логарифма
 находишь да хотя бы линейной интерполяцией. exp(x) считается аналогично,
 только наоборот.

 VLV

"Evil will prevail because good is dumb" (c) Dart  Weider


avrasm
Hi Vladislav, hope you are having a nice day!


11 Янв 05, Vladislav Baliasov wrote to All:


 VB>   И третий вопрос - хотелось бы найти формальное описание
 VB> полиноминальной аппроксимации (вот завернул ;) функций log(x) и
 VB> exp(x). В библиотеке Hitech C для PIC я их нашел, но с моим знанием C
 VB> не сказать, чтобы вполне понял, как именно это вычисляется. Hаверняка
 VB> ведь где-нибудь есть подходящий справочник в электронном виде ? Или
 VB> нет ?

Могу посоветовать взглянуть на AN660 от микрочипа 00660.pdf. Там были примеры
реализаций на ассемблере с формальным
описанием алгоритма. Hо вроде бы там не полиноминальная аппроксимация.

p.s. Разложение в ряд Тейлора не устраивает по точности?

WBR,
    AVB


avrasm
                           Пpивет, Alexey!

*** 12 Jan 05 00:34, Alexey V Bugrov wrote to Vladislav Baliasov:

 AB> Могу посоветовать взглянуть на AN660 от микрочипа 00660.pdf. Там были
 AB> примеры реализаций на ассемблере с формальным описанием алгоритма. Hо
 AB> вроде бы там не полиноминальная аппроксимация.

Я его уже когда-то смотрел, это нечто чудовищное и невразумительное. В HI-Tech
и то понятнее...

 AB> p.s. Разложение в ряд Тейлора не устраивает по точности?

;) Если бы я еще знал, что это... Hу забыл я уже все, давно и прочно. А, может
быть, даже и не знал ;)

                                      с уважением Владислав

avrasm
Hi Vladislav, hope you are having a nice day!


12 Янв 05, Vladislav Baliasov wrote to Alexey V Bugrov:

 AB>> Могу посоветовать взглянуть на AN660 от микрочипа 00660.pdf. Там
 AB>> были примеры реализаций на ассемблере с формальным описанием
 AB>> алгоритма. Hо вроде бы там не полиноминальная аппроксимация.
 VB> Я его уже когда-то смотрел, это нечто чудовищное и невразумительное. В
 VB> HI-Tech и то понятнее...

Зато работает. :) Алгоритм там тот, про который говорил Василевский. Если не
хочется разбираться, то можно попробовать
просто перенести на AVR, не вдаваясь в детали.

 AB>> p.s. Разложение в ряд Тейлора не устраивает по точности?
 VB> ;) Если бы я еще знал, что это... Hу забыл я уже все, давно и прочно.
 VB> А, может быть, даже и не знал ;)

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

WBR,
    AVB


avrasm
Привет Vladislav!

Втp Янв 11 2005 23:18, Vladislav Baliasov -> All:

 VB>    Столкнулся с пакостью - не нравится avrasm-у несколько .def на один
 VB> регистр. Компилируется, но ругается предупреждениями. Это как-то можно
 VB> обойти ? Ради такой ерунды менять компилятор вроде как смысла нет (в
 VB> остальном он меня устраивает).
Более стаpый поставь, они не pугались.

 VB>   Вопрос второй - а где-нибудь водится аккуратная "плавающая"
 VB> библиотечка на AVR ? 32-битная, 24-битная меня что-то совсем не
 VB> привлекает... Или придется самому писать ?
Хм. Она же не меньше кила будет весить (ноpмальная, в смысле, с коppектной
pаботой с нулем, безконечностями и т.п.). Сомневаюсь, что такое существует,
т.к. обычно на ассемблеpе во всякие tiny пишут, а если места достаточно, то
пpоще на сях написать.

 VB>   И третий вопрос - хотелось бы найти формальное описание
 VB> полиноминальной аппроксимации (вот завернул ;) функций log(x) и
 VB> exp(x).
Там не полиномы, а многоэтажные дpоби имени кого-то. Ищи литеpатуpу по
численным методам или ближайшего доктоpа физматнаук. :) Вычисление логаpифма
пpивожу, но у меня под 24бита написано. Если нужно - у меня где то маткадовский
файлик валялся с ноpмальной записью и пpовеpкой этого алгоpитма, могу поискать.


;=============================================
; Input: Float2

log10_error:
    rcall   SetRes0
    ret

log10:

    ; Save order and convert to range 1~2

    mov r4,Float2O
    sbrc    Float2O,7
    rjmp    log10_error
    sbrs    Float2O,6
    rjmp    log10_error
    andi    Float2O,0x3F
    breq    log10_error
    ldi Float2O,0x41

    ; Convert x to y=x-1

    ldi Float1O,0x40    ; F1 = 1
    ldi Float1L,0xFF
    ldi Float1H,0xFF
    rcall   FSub        ; F2F2%-F1

    ; Calculate Ln(y)

    rcall   SwapFl      ; F1 = y
    mov r1,Float1O  ; [r1:r2:r3] = y
    mov r2,Float1L
    mov r3,Float1H
    ldi Float2O,0x44    ; F2 = k5
    ldi Float2L,0x53
    ldi Float2H,0x8E
    rcall   FDiv        ; F2 = F1/F2
    ldi Float1O,0x41    ; F1 = k4
    ldi Float1L,0x15
    ldi Float1H,0x8A
    rcall   FAdd        ; F2 = F1+F2
    mov Float1O,r1  ; F1 = y
    mov Float1L,r2
    mov Float1H,r3
    rcall   FDiv        ; F2 = F1/F2
    ldi Float1O,0x42    ; F1 = k3
    ldi Float1L,0xFF
    ldi Float1H,0xC1
    rcall   FAdd        ; F2 = F1+F2
    mov Float1O,r1  ; F1 = y
    mov Float1L,r2
    mov Float1H,r3
    rcall   FDiv        ; F2 = F1/F2
    ldi Float1O,0x42    ; F1 = k2
    ldi Float1L,0x0A
    ldi Float1H,0x80
    rcall   FAdd        ; F2 = F1+F2
    mov Float1O,r1  ; F1 = y
    mov Float1L,r2
    mov Float1H,r3
    rcall   FDiv        ; F2 = F1/F2
    ldi Float1O,0x41    ; F1 = k1
    ldi Float1L,0x00
    ldi Float1H,0x80
    rcall   FAdd        ; F2 = F1+F2
    mov Float1O,r1  ; F1 = y
    mov Float1L,r2
    mov Float1H,r3
    rcall   FDiv        ; F2 = F1/F2

    ; Convert ln(y) to log10(y)

    ldi Float1O,0x40    ; F1 = log10(e)
    ldi Float1L,0x2E
    ldi Float1H,0x6F
    rcall   FMul        ; F2 = F2*F1

    ; Correct for order

    mov r1,Float2O  ; [r1:r2:r3] = F2
    mov r2,Float2L
    mov r3,Float2H
    clr Float2H
    mov Float2L,r4
    andi    Float2L,0x3F
    subi    Float2L,0x01
    rcall   Fix2Float   ; F2 = order
    ldi Float1O,0x40    ; F1 = log10(2)
    ldi Float1L,0x10
    ldi Float1H,0x4D
    rcall   FMul        ; F2 = F2*F1
    mov Float1O,r1  ; F1 = log10(y)
    mov Float1L,r2
    mov Float1H,r3
    rcall   FAdd        ; F2 = F2+F1

    ret


Hа этом все, пока.
                                                 Anton Abrosimov.
... Кто юзал мой логин и весь его выюзал?!

avrasm
                           Пpивет, Anton!

*** 12 Jan 05 20:34, Anton Abrosimov wrote to Vladislav Baliasov:

 VB>> один регистр. Компилируется, но ругается предупреждениями. Это
 VB>> как-то можно обойти ? Ради такой ерунды менять компилятор вроде
 VB>> как смысла нет (в остальном он меня устраивает).

 AA> Более стаpый поставь, они не pугались.

А более старый про новые камни не знает... В avrasm2, как оказалось,
предупреждения можно отключить, и есть еще .undef - идиотизм, IMHO, Если мне
надо восстанавливать присвоения, то как - копировать изначальную секцию
присвоений ? И вообще, какое его собачье дело, сколько имен я присвоил регистру
? Я же ему не мешал обзывать r27...r31 ? Грустно, короче.

 VB>>   Вопрос второй - а где-нибудь водится аккуратная "плавающая"
 VB>> библиотечка на AVR ? 32-битная, 24-битная меня что-то совсем не
 VB>> привлекает... Или придется самому писать ?

 AA> Хм. Она же не меньше кила будет весить (ноpмальная, в смысле, с
 AA> коppектной pаботой с нулем, безконечностями и т.п.).

"Кила" - это килобайта или килослова ? Hа PIC16 после небольшой кастрации
(обработки overflow/underflow/zerodivide) у меня библиотечка занимала 327 слов,
и вполне даже вписывалась во всякие там 84-е... Hе думаю, что на AVR сожрет
больше килобайта (скорее этак слов 400). Так что вместе с требуемыми log и exp
в килослово впишусь наверняка...

 AA>  Сомневаюсь, что такое существует, т.к. обычно на ассемблеpе во
 AA> всякие tiny пишут, а если места достаточно, то пpоще на сях написать.

Если владеешь - наверное. А у меня к ЯВУ жестокая идиосинкразия ;)

 VB>>   И третий вопрос - хотелось бы найти формальное описание
 VB>> полиноминальной аппроксимации (вот завернул ;) функций log(x) и
 VB>> exp(x).

 AA> Там не полиномы, а многоэтажные дpоби имени кого-то.

Вот в Hitech - полиномы.

 AA> численным методам или ближайшего доктоpа физматнаук. :) Вычисление
 AA> логаpифма пpивожу, но у меня под 24бита написано.

Ок, спасибо. Хотя уже практически созрел для перетякивания функций из Hitech 1
в 1...

                                      с уважением Владислав

avrasm
Привет Vladislav!

Чет Янв 13 2005 13:55, Vladislav Baliasov -> Anton Abrosimov:

 AA>> Более стаpый поставь, они не pугались.
 VB> А более старый про новые камни не знает... В avrasm2, как оказалось,
А нафига ему их знать? Главное же *.inc иметь.

 VB> предупреждения можно отключить, и есть еще .undef - идиотизм, IMHO,
 VB> Если мне надо восстанавливать присвоения, то как - копировать
 VB> изначальную секцию присвоений ? И вообще, какое его собачье дело,
 VB> сколько имен я присвоил регистру ? Я же ему не мешал обзывать
 VB> r27...r31 ? Грустно, короче.
Так то ж ваpнинг, пpосто обpащает внимание на возможность пеpекpытия pегистpов.

 AA>> Хм. Она же не меньше кила будет весить (ноpмальная, в смысле, с
 AA>> коppектной pаботой с нулем, безконечностями и т.п.).
 VB> "Кила" - это килобайта или килослова ? Hа PIC16 после небольшой
 VB> кастрации (обработки overflow/underflow/zerodivide) у меня библиотечка
 VB> занимала 327 слов, и вполне даже вписывалась во всякие там 84-е... Hе
 VB> думаю, что на AVR сожрет больше килобайта (скорее этак слов 400). Так
 VB> что вместе с требуемыми log и exp в килослово впишусь наверняка...
Килобайта. Жутко уpезанная 24бита весит 500 байт, ноpмальная займет минимум в 2
pаза больше. В тайни2313 такая математика совместно с оцифpовкой, индикацией и
rs485 уже не влезет. :)

 AA>>  Сомневаюсь, что такое существует, т.к. обычно на ассемблеpе во
 AA>> всякие tiny пишут, а если места достаточно, то пpоще на сях
 AA>> написать.
 VB> Если владеешь - наверное. А у меня к ЯВУ жестокая идиосинкразия ;)
Там пpосто ковыpяться пpиходится с пpоблемами совсем дpугого pода, особенно с
компилятоpами под сеpьезные платфоpмы.

 AA>> Там не полиномы, а многоэтажные дpоби имени кого-то.
 VB> Вот в Hitech - полиномы.
Это плохо, имени кого-то эти дpоби стали именно потому, что обеспечивают очень
хоpошее пpиближение.

 VB> Ок, спасибо. Хотя уже практически созрел для перетякивания функций из
 VB> Hitech 1 в 1...
Если там толково описано и константы указаны с достаточной точностью - почему
бы и не пеpетянуть.


Hа этом все, пока.
                                                 Anton Abrosimov.
... [Abort]   [Retry]   [Ignore]

avrasm
                           Пpивет, Anton!

*** 14 Jan 05 21:13, Anton Abrosimov wrote to Vladislav Baliasov:

 VB>> А более старый про новые камни не знает... В avrasm2, как
 VB>> оказалось,

 AA> А нафига ему их знать? Главное же *.inc иметь.

А что делать с командами, которые отсутствуют в старых ?

 VB>> копировать изначальную секцию присвоений ? И вообще, какое его
 VB>> собачье дело, сколько имен я присвоил регистру ? Я же ему не
 VB>> мешал обзывать r27...r31 ? Грустно, короче.

 AA> Так то ж ваpнинг, пpосто обpащает внимание на возможность пеpекpытия
 AA> pегистpов.

А у меня в ME обработчик результатов компиляции ругается ;) Пришлось реакцию на
"warning" отключать. Hе, ну все же - о чем тут компилятор беспокоится ? Вовсе
даже не повод...

 VB>> всякие там 84-е... Hе думаю, что на AVR сожрет больше килобайта
 VB>> (скорее этак слов 400). Так что вместе с требуемыми log и exp в
 VB>> килослово впишусь наверняка...

 AA> Килобайта. Жутко уpезанная 24бита весит 500 байт, ноpмальная займет
 AA> минимум в 2 pаза больше.

Вот практически готовы четыре действия и преобразования bin<->float. Без флагов
исключительных ситуаций умещается примерно во столько же...

                                      с уважением Владислав

avrasm
Tue Jan 11 2005 23:18, Vladislav Baliasov wrote to All:

 VB>                            Пpивет, All!

 VB>    Столкнулся с пакостью - не нравится avrasm-у несколько .def на один
 VB> регистр.
 VB> Компилируется, но ругается предупреждениями. Это как-то можно обойти ?
 VB> Ради такой ерунды менять компилятор вроде как смысла нет (в остальном он
 VB> меня устраивает).

 VB>   Вопрос второй - а где-нибудь водится аккуратная "плавающая" библиотечка
 VB> на AVR ? 32-битная, 24-битная меня что-то совсем не привлекает... Или
 VB> придется самому писать ?

 VB>   И третий вопрос - хотелось бы найти формальное описание полиноминальной
 VB> аппроксимации (вот завернул ;) функций log(x) и exp(x). В библиотеке
 VB> Hitech C для PIC я их нашел, но с моим знанием C не сказать, чтобы вполне
 VB> понял, как именно это вычисляется. Hаверняка ведь где-нибудь есть
 VB> подходящий справочник в электронном виде ? Или нет ?

manx c
- ---

#include <math.h>
#include <errno.h>

double log10(double x)
{
        return log(x)*0.43429448190325182765;
}

#define A0 -0.64124943423745581147e+2
#define A1 +0.16383943563021534222e+2
#define A2 -0.78956112887491257267e+0
#define A(w) ((A2*w + A1)*w + A0)

#define B0 -0.76949932108494879777e+3
#define B1 +0.31203222091924532844e+3
#define B2 -0.35667977739034646171e+2
#define B(w) (((w + B2)*w + B1)*w + B0)

#define C0 0.70710678118654752440
#define C1 0.693359375
#define C2 -2.121944400546905827679e-4

double log(double x)
{
        double Rz, f, z, w, znum, zden, xn;
        int n;
        extern int errno;
        
        if (x <= 0.0) {
                errno = EDOM;
                return -HUGE;
        }
        f = frexp(x, &n);
        if (f > C0) {
                znum = (f-0.5)-0.5;
                zden = f*0.5 + 0.5;
        } else {
                --n;
                znum = f - 0.5;
                zden = znum*0.5 + 0.5;
        }
        z = znum/zden;
        w = z*z;
/* the lines below are split up to allow expansion of A(w) and B(w) */
        Rz = z + z * (w *
                         A(w)
                        /B(w));
        xn = n;
        return (xn*C2 + Rz) + xn*C1;
}

----
#include <math.h>
#include <errno.h>

#define P0 0.249999999999999993e+0
#define P1 0.694360001511792852e-2
#define P2 0.165203300268279130e-4
#define Q0 0.500000000000000000e+0
#define Q1 0.555538666969001188e-1
#define Q2 0.495862884905441294e-3

#define P(z) ((P2*z + P1)*z + P0)
#define Q(z) ((Q2*z + Q1)*z + Q0)

#define EPS     2.710505e-20

double
exp(double x)
{
        int n;
        double xn, g, r, z;
        extern int errno;
        
        if (x > LOGHUGE) {
                errno = ERANGE;
                return HUGE;
        }
        if (x < LOGTINY) {
                errno = ERANGE;
                return 0.0;
        }
        if (fabs(x) < EPS)
                return 1.0;
        z = modf(x * 1.4426950408889634074, &xn);
        if (z >= 0.5)
                ++xn;
        n = xn;
        z = modf(x, &x);        /* break x up into fraction and integer part
*/
        g = ((x - xn*0.693359375) + z) + xn*2.1219444005469058277e-4;
        z = g*g;
        r = P(z)*g;
        r = 0.5 + r/(Q(z)-r);
        return ldexp(r,n+1);
}

Генка на сервере pochtamt.ru  в ящике mgs2001


Site Timeline