Үлкен арифметиканы дұрыс өңдеу әдісі

қарапайым жауапты қажет ететін мәселе. Ардуинодағы арифметикалық қадамдардың көп мөлшерін тиімді және дәл қалай өңдеуге болады?

Мысалы, менде осы код функциясының параметрі бар:

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 енгізілсе, excel ішіндегі есептеулерімнің негізінде шығыс -4.22 болуы керек.

0
Өтініштерді, нақты нәтижені және күтілетін нәтижені көрсетіңіз. Кейбір қосымша Serial.print («answer:») қойыңыз; Serial.println (жауап); проблеманы оқшаулау үшін кодты отладтау.
қосылды автор Dave X, көзі
Және бұл нені басып шығарады? Мен «input = 5» деп қоямын; calc() алдында кодта, содан кейін күтпеген нәрсе алғанға дейін кальц() ішінде дифографты отладпен басып шығаруды көріңіз.
қосылды автор Dave X, көзі
Тағы да, сіз num1-ді екі рет өшіргіңіз келеді немесе өңдеуден кейін num2 мәнін жойғыңыз келді ме?
қосылды автор Dave X, көзі
Пайдалы болғаным - электрондық кестеде немесе кішкене консольді қолданудағы (тіпті күрделі емес) күрделі алгоритмдерді тексеру. Оларды жұмыс істегенде, мен Ардуино кодексіне ауысамын, ол өте қарапайым. Бұл қате кодтың кепілі емес, бірақ бұл өте жақын.
қосылды автор Nayt Grochowski, көзі
ол @DaveX кірісіне қарамастан -113.70 басып шығарады
қосылды автор TestOChangeO, көзі

2 жауаптар

Сіз әрдайым бірдей мәнді аласыз, себебі бұл есептелетін мән.

Мен сіздің формулаңызды қалай жүзеге асырғаныңызды дұрыс деп ойлаймын. Егер сіз «жауап» жолынан бастасаңыз және айнымалы мәндерді осы айнымалы мәндерді құрайтын формулалармен немесе мәндермен бірнеше рет алмастырсаңыз, сіз мыналармен аяқталады:

жауап = (11.4 - (((4401 * 14.164) + ((((12404 - 4401) * (1 - ((14.3 - (12404 - 4401))/(14.3 - (12404 - 4401)) + (12404 - 4401 - 1,8)/(12404 - 4401 - 1,8) + (14,3) - (14404 - 4401 - 1,8)/(12404 - 4401 - 1,8) - (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
қосылды