如何正确处理大型算术

只是一个需要简单回答的问题。如何高效精确地处理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,则根据我在excel中的计算,输出应为-4.22。

0
请显示声明,实际结果和预期结果。并添加一些额外的Serial.print(“回答:”); Serial.println(回答);调试代码以帮助您隔离问题。
额外 作者 Dave X,
它打印什么?我把“输入= 5;”在calc()之前的代码中,然后尝试在calc()中进行diffft调试打印,直到出现意外情况。
额外 作者 Dave X,
再次,您是要清除num1两次还是打算在处理后清除num2。
额外 作者 Dave X,
我发现有用的是在电子表格或小型控制台应用程序中测试复杂的算法(甚至不是那么复杂的算法)。一旦我让他们工作,我转换为Arduino代码,这是非常简单的。这不是无错误代码的保证,但它非常接近。
额外 作者 Nayt Grochowski,
无论输入@DaveX如何,它都会打印-113.70
额外 作者 TestOChangeO,

2 答案

您每次都获得相同的值,因为这是正在计算的值。

我认为你如何实施你的公式有问题。如果从“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

根本就没有任何变数。

您的输入值用于计算 batterymomentbatterymoment 我们用来计算 totalmomenttotalmoment 用于计算 wheelmomentwheelmoment 用于计算 cgwheelscgwheels 永远不会用于任何事情

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
额外