float вопрос дилетанта.

stepan_sotnikov
Offline
Зарегистрирован: 06.04.2019

Встречаю в различных программах под камни 8бит на Arduino такие не понятны вещи как  float с диким значением.... например: http://robotclass.ru/articles/complementary-filter/
 

#define TO_DEG 57.29577951308232087679815481410517033f

 

Еще видил Pi до хз какого знака... И везде отсутсвует процедуры длинной арифметики... Я сталкиваюсь с потерей точности на трехзначном числе с точностью до четвертого знака... 
И на Ютубе, и в уроках... причем я так с ходу сказать не могу, что люди не понимают, что делают... по этому закрались сомнения... Может я не понимаю, что то? 
Вопрос: Можно разобрать конкретный случай (не вдаваясь в подробности, потому, что втом, что я разбирасбь я могу сказать, автор этой конкретной стати либо не понимает, либо намеренно упростил... и говорит чушь) вопрос в другом вопрос в переменной с такой точностью? Ардуина просто ее не обработает в моем понимании? Или я не прав? Исходный код который по ссылки. 
 

include "I2Cdev.h"
#include "MPU6050.h"

#define TO_DEG 57.29577951308232087679815481410517033f
#define T_OUT 20 // каждый 20 миллисекунд будем проводить вычисления 
#define P_OUT 50 // каждый 50 миллисекунд будем выводить данные
#define FK 0.1 // коэффициент комплементарного фильтра

MPU6050 accelgyro;

float angle_ax, angle_gx, angle_cpl;
int dt = 0;
long int t_next, p_next;

// функция, которая не даёт значению выйти за пределы 
float clamp(float v, float minv, float maxv){
    if( v>maxv )
        return maxv;
    else if( v<minv )
        return minv;
    return v;
}

void setup() {
    Serial.begin(9600);
    // инициализация MPU6050
    accelgyro.initialize();
    Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
}

void loop() {
    long int t = millis();
    // каждые T_TO миллисекунд выполняем рассчет угла наклона
    if( t_next < t ){
        int16_t ax_raw, ay_raw, az_raw, gx_raw, gy_raw, gz_raw;
        float ay,gx;

        t_next = t + T_OUT;
        // получаем сырые данные от датчиков в MPU6050
        accelgyro.getMotion6(&ax_raw, &ay_raw, &az_raw, &gx_raw, &gy_raw, &gz_raw);

        // преобразуем сырые данные гироскопа в град/сек
        gx = gx_raw / 16.4;
        // преобразуем сырые данные акселерометра в G
        ay = ay_raw / 4096.0;
        ay = clamp(ay, -1.0, 1.0);

        // вычисляем угол наклона по акселерометру
        angle_ax = 90 - TO_DEG*acos(ay);
        // вычисляем угол наклона по гироскопу
        angle_gx = angle_gx + gx * T_OUT/1000.0;
        // корректируем значение угла с помощью акселерометра
        angle_gx = angle_gx*(1-FK) + angle_ax*FK;
    }

    t = millis();
    // каждые P_OUT миллисекунд выводим результат в COM порт
    if( p_next < t ){
        p_next = t + P_OUT;
        Serial.println(angle_gx);
    }
}

 

Onkel
Offline
Зарегистрирован: 22.02.2016

Это авторы прикалываются так.

 

nik182
Offline
Зарегистрирован: 04.05.2015

Это задел на будущее. Вдруг в 8 битном какмне в компиляторе тип двойной дабл реализуют? 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

«говорить не токмо по бумаге, но и своими словами, дабы 

 
дурь каждого наружу видна была». (Петр I Алексеевич)
 
Что, собственно, непонятно? Числа типа float имеют мантиссу 23 десятичных знака. Что еще нужно для оценки погрешности?
stepan_sotnikov
Offline
Зарегистрирован: 06.04.2019

Непонятно зачем указывать, число до такой точности, если оперировать с достоверной точностью на 8бит мы можем от силы до 6 знака, если программно не предусмотрен алгоритм работы с такими переменными. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

И что именно Вы предлагаете? Законодательно запретить?

stepan_sotnikov
Offline
Зарегистрирован: 06.04.2019

Я не предлагаю, я просто хотел понять... Может я чего то не знаю или не понимаю. Может есть тайный смысл. Может это для переносимости кода... Ну или дань традициям =)))