Как правильно обрабатывать большие арифметические операции

просто вопрос, требующий простого ответа. Как я могу обрабатывать большое количество арифметических шагов в arduino эффективно и точно?

Например, у меня есть эта настройка функции кода:

void calc() {
  batterymoment = input*batterymass;
  totalmoment = 149650+batterymoment;
  buoyancymoment = buoyancymass*centrebuoyancy;
  wheelmoment = totalmoment - buoyancymoment;
  wheelweight = totalmass - buoyancymass;
  cgwheels = wheelmoment/wheelweight;
  maindistance = mainarm - wheelweight;
  nosedistance = wheelweight - nosearm;
  mainmass = (((wheelweight)*(1-((maindistance)/(maindistance+nosedistance))))/2);
  nosemass = (((wheelweight)*(1-((nosedistance)/(nosedistance+maindistance))))/2);
  mainmoment = mainmass*mainarm;
  nosemoment = nosemass*nosearm;
  netmoment = buoyancymoment+mainmoment+nosemoment;
  netcg = netmoment/totalmass;
  staticmargin = adc - netcg;
  answer = staticmargin/meanadc;

}

Теперь я правильно настроил типы данных для всех этих переменных, и они представляют собой комбинацию float, int и long. Я не думаю, что это проблема с типом данных. То, что я получаю, когда печатаю окончательный ответ в серийном номере, - это тот же номер, независимо от ввода, который вводит пользователь.

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

Любые рекомендации приветствуются. Благодарю.

Вот код целиком:

unsigned long batterymoment,num1,num2,input,totalmoment;
double buoyancymoment,wheelmoment,cgwheels,mainmass,nosemass,maindistance,nosedistance;
double mainmoment,nosemoment,netmoment,netcg,staticmargin,answer;
double centrebuoyancy = 14.164;
double mainarm = 14.3;
double adc = 11.4;
double meanadc = 22.65;
double nosearm = 1.8;
int totalmass = 12404;
int batterymass = 720;
int buoyancymass = 4401;
int batteryposition,wheelweight;
boolean mySwitch = false;

void calc() {
  batterymoment = input*batterymass;
  totalmoment = 149650+batterymoment;
  buoyancymoment = buoyancymass*centrebuoyancy;
  wheelmoment = totalmoment - buoyancymoment;
  wheelweight = totalmass - buoyancymass;
  cgwheels = wheelmoment/wheelweight;
  maindistance = mainarm - wheelweight;
  nosedistance = wheelweight - nosearm;
  mainmass = (((wheelweight)*(1-((maindistance)/(maindistance+nosedistance))))/2);
  nosemass = (((wheelweight)*(1-((nosedistance)/(nosedistance+maindistance))))/2);
  mainmoment = mainmass*mainarm;
  nosemoment = nosemass*nosearm;
  netmoment = buoyancymoment+mainmoment+nosemoment;
  netcg = netmoment/totalmass;
  staticmargin = adc - netcg;
  answer = staticmargin/meanadc;  
 }

void setup() {
  Serial.begin(9600);
  num1=0;
  num2=0;
  Serial.println("Enter battery position");
 }

void loop() {
  while (Serial.available()){
    batteryposition = Serial.read();
    if(batteryposition>47 && batteryposition<58){  
      if(!mySwitch){
         num1=(num1*10)+(batteryposition-48);
      }else{
         num2=(num2*10)+(batteryposition-48);
        }
       }

if(batteryposition==61){
  input=num1+num2;
  calc();
  Serial.print("Static margin is: ");
  Serial.println(answer);
  num1=0;
  num1=0;
  mySwitch=false;
  }
 }
}

Поэтому, в зависимости от пользовательского ввода, вычисления изменят окончательный ответ на выход. Например, если нужно ввести 5, выход должен быть -4.22 на основе моих вычислений в excel.

0
Просьба показать декларации, фактический результат и ожидаемый результат. И добавьте дополнительный Serial.print («ответ:»); Serial.println (ответ); отлаживая код, чтобы помочь вам изолировать проблему.
добавлено автор Dave X, источник
И что он печатает? Я бы поставил «input = 5;» в коде перед calc (), а затем попробуйте выполнить отладочную печать diff в calc (), пока не получите что-то неожиданное.
добавлено автор Dave X, источник
Опять же, вы хотите очистить num1 дважды, или вы намерены очистить num2 после обработки.
добавлено автор Dave X, источник
То, что я нашел полезным, - это тестирование сложных алгоритмов в электронной таблице или небольшом консольном приложении (даже не очень сложных). Как только я получу их работу, я конвертирую в код Arduino, что довольно просто. Это не гарантия бесплатного кода, но это довольно близко.
добавлено автор Nayt Grochowski, источник
он печатает -113.70 независимо от входа @DaveX
добавлено автор TestOChangeO, источник

2 ответы

Вы получаете одно и то же значение каждый раз, потому что это значение, которое вычисляется.

Я думаю, что у вас что-то не так, как вы внедрили свою формулу. Если вы начинаете с «answer =» и многократно подставляете переменные формулами или значениями, составляющими эти переменные, вы в итоге получаете следующее:

answer = (11.4 - ((4401 * 14.164) + ((((12404 - 4401) * (1 - ((14.3 - (12404 - 4401))/((14.3 - (12404 - 4401)) + (12404 - 4401 - 1,8)))))/2) * 14.3) + ((((12404 - 4401) * (1 - ((12404 - 4401 - 1,8)/((12404 - 4401 - 1,8) + (14,3 - (12404 - 4401))))))/2) * 1.8))/12404))/22.65

В этом нет ничего особенного.

Ваше входное значение используется для вычисления batterymoment . batterymoment нас используется для вычисления totalmoment . totalmoment используется для вычисления wheelmoment . wheelmoment используется для вычисления cgwheels . cgwheels никогда не используется для чего-либо .

3
добавлено

За ваши комментарии функция calc() работает не так, как ожидалось.

Изменить calc() будет следующим:

void calc() {
  Serial.print("input:");Serial.println(input);
  batterymoment = input*batterymass;
  totalmoment = 149650+batterymoment;
  buoyancymoment = buoyancymass*centrebuoyancy;
  wheelmoment = totalmoment - buoyancymoment;
  wheelweight = totalmass - buoyancymass;
  cgwheels = wheelmoment/wheelweight;
  maindistance = mainarm - wheelweight;
  nosedistance = wheelweight - nosearm;
  mainmass = (((wheelweight)*(1-((maindistance)/(maindistance+nosedistance))))/2);
  nosemass = (((wheelweight)*(1-((nosedistance)/(nosedistance+maindistance))))/2);
  mainmoment = mainmass*mainarm;
  nosemoment = nosemass*nosearm;
  netmoment = buoyancymoment+mainmoment+nosemoment;
  netcg = netmoment/totalmass;
  staticmargin = adc - netcg;
  answer = staticmargin/meanadc;
  Serial.print("answer:");Serial.println(answer);  
 }

и посмотреть, получит ли он ожидаемые входы и работает, как ожидалось. Затем добавьте отладочные операторы в процессе, пока не обнаружите несоответствие.

Я бы включил больше функции или ряд более четко определенных функций, а затем проверил их индивидуально.

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

0
добавлено
Анархическая электроника
Анархическая электроника
1 510 участник(ов)

[около] электронные темы. без переходов на личности, стен стикеров, политики, непрошенной рекламы и всякого такого Основной чат у нас в @ru_electronics Общий информационный канал @ru_electronics_feed

Про электронику
Про электронику
1 461 участник(ов)

QA чат для решения вопросов, связанных с электроникой. без стикеров, непрошенной рекламы и игр в русский форум оформляйте вопрос в одно сообщение вопросы со словом «кто» игнорируются don't ask for ask Правила http://telegra.ph/ru-electronics-rulz-11-11

Embedded Group
Embedded Group
873 участник(ов)

Все про Embedded и электронику. Осторожно, бывают нотификейшены. #вопросподелу - Для поиска вопросов и ответов #devtools - фотки рабочих железок Работа: @rabotaembedded http://embedded.group http://vk.com/embedded_space

Hardware & Radio
Hardware & Radio
155 участник(ов)

Разговоры об электронике, микроконтроллерах, низкоуровневом программировании, реверс-инжиниринге, FPGA, квадрокоптерах, 3D-печати, Software Defined Radio, любительском радио, и всяком таком.

ARDUINO [RU]
ARDUINO [RU]
60 участник(ов)

Обсуждение Электронного конструктора Arduino. Проблемы и их решения. Ссылки на интересные статьи и проекты. ВК: https://vk.com/arduino_esp Realtek: http://vk.com/rtl8711 Чаты: IOT https://t.me/ProIOT esp8266 https://t.me/Proesp8266