не подскажете, как бы мне точность вычислений приподнять? const float R0 = 100.0f; const float A = 3.9083E-3; const float B = -5.775E-7; float temp = (-A + sqrtf(A*A - 4*B*(1-(resistance/R0))))/(2*B); по идее я везде в 23 бита попадаю, размерность сходная, но что за нафиг?..
Комментарии: 38
Bga
Температуру считаешь? У меня без float
Bga
stm8-ntc-temperature-display-DSN_VC288/NtcThermistor.h at master · bga/stm8-ntc-temperature-display-DSN_VC288 · GitHub https://github.com/bga/stm8-ntc-temperature-display-DSN_VC288/blob/master/common-src/NtcThermistor.h Но у меня логарифмическая форумула 23 бита * 23 бита будет 46
Serge
Ntc считается как rtd, только с другими коэффициентами?
Bga
Думаю что нет. У тебя в вики там квадратное уравнение решать
Serge
мда... посчитал по шагам, ошибка копится очень бодро похоже, проще будет lut сочинить
Bga
Double не завезли?
Serge
double дорого...
Bga
Вот я и считаю в fixed point
Serge
Когда надо посчитать корень, ты преобразуешь к float или как-то иначе, по Ньютону, например? Когда нужна точность выше 23 бит дробной части, к float преобразовывать не вариант
Bga
_cpp/sqrt.h at master · bga/_cpp · GitHub https://github.com/bga/_cpp/blob/master/include/!cpp/Math/Fp/sqrt.h ^
Karboflex
ну си както через либу считает корень на процах без фпу)) вобще посчитать в фпу обычно дешевле и быстрее по ресурсам чем мучать алу))
Bga
На stm8 нету fpu Fpu вообще мало где есть
Serge
Не мой случай, я заданной точности достигаю только на 24 битах. Это или double, или думать Ну... М4 и жирнее
Karboflex
я помню что в фортране есть либы которые решают вопрос накопленой ошибках при расчётах
Serge
Где можно посмотреть, как дешевле: через double на fpu или fixedpoint?
Karboflex
самое верное написать две реализации и сравнить) а так дсп инструкции выполняются за 1 такт жеж,
Bga
Ну fixed point корень видишь бинарным цыклом сделан. Конечно не быстро
Serge
Кому интересно, вот годное обсуждение про log, pow и exp для fp https://stackoverflow.com/questions/4657468/fast-fixed-point-pow-log-exp-and-sqrt Мне очень нравится корень из hacker's delight, жаль, неточный)
Bga
Так ещё fast inverse square root кармака
Serge
Это не Кармак придумал)
Karboflex
Кармак придумал делать игровой движок раньше чем под него появится железка Под октовоксельное древо железо так и не вышло и он ушел делать шлемы для вр
Bga
Я начал писать генерик fixed point на любой тип и смещение точки но там ещё долго. Фактически это то что гцц пишет но экспонента не рантайм а параметр шаблона
Serge
И это не
Элтон ДжонКармак придумал, что не отменяет, что он кросафчег) Не поможет? https://gcc.gnu.org/wiki/FixedPointArithmeticBga
Ну таких типов у меня нет. У меня iar для stm8 Будет ch32v003 там перейду на нормальный гцц
Serge
Я от думаю: а можно ли написать генерик на С?пока самое разумное - иметь сигнатуры вида fixop(a, b, len, nfracbits) и дописывать через generic_macro по необходимости
Bga
Кресты удобнее за счёт шаблонов
Serge
Эт да
Karboflex
а потом память кудато делась)
Serge
Шаблон кушает память только если сгенерированная сигнатура вызывается, не?
Karboflex
да там вобще компилятор умудряется чуть больше хавать на том же самом)
Bga
typename ...:type static contexpr
Serge
Где-то я видел вычисления на шаблонах, когда в компайл тайм уравнения решались, а во время компиляции можно было поиграть в крестики-нолики)
Bga
_stm8/PullHiZ.h at master · bga/_stm8 · GitHub https://github.com/bga/_stm8/blob/master/include/!hal/Pin/PullHiZ.h Зато можно такую хрень писать Как там ввод сделали?
Karboflex
мне гдето в чатике расказывали) что препроцессор умудрялся считанные строки разматываеть в гигабайты текста которые потом весь день компилировал)
Serge
Мне нравится набор от lamerok с хабра Свистят, глубину вложенности надо будет руками добавлять, нативно немного
Karboflex
свистят не свистят а повод призадуматься))
Bga
Рекурсивные шаблоны? Можно функцию Акермана на шаблонах написать. Чтобы твоих 64гб ОЗУ не хватило
Anonim
посмотрите в книге Фрунзе. "микроконтроллеры это просто том 4" там автор в 8 битном mcs-51 float впихнул в три байта. и кучу функций sin cos в бонус вам там же будет.