# How to properly process large arithmetic

just a question that requires a simple answer. How do I process a large number of arithmetic steps in arduino efficiently and precisely?

For example I have this code function setup:

``````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;

}
``````

Now I've properly setup up data types for all of these variables and they are a combination of float, int and long. I don't think it's a problem with the data type. What I'm getting when I print final answer in the serial is the same number regardless the input the user enters.

I'm guessing I need to format the code in such a way that it performs each line step by step and verifies the answer before proceeding to the next arithmetic line. If so would I need a function for each arithmetic step? Or is there a simpler way to process this that I'm missing.

Any guidance is appreciated. Thanks.

Here is the code in its entirety:

``````unsigned long batterymoment,num1,num2,input,totalmoment;
double buoyancymoment,wheelmoment,cgwheels,mainmass,nosemass,maindistance,nosedistance;
double centrebuoyancy = 14.164;
double mainarm = 14.3;
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;
}

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

void loop() {
while (Serial.available()){
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: ");
num1=0;
num1=0;
mySwitch=false;
}
}
}
``````

So depending on the user input, the calculations will change the final output answer. For example if a 5 should be entered the output should be -4.22 based on my calculations in excel.

• Please do show the declarations, the actual result, and the expected result. And put some extra Serial.print("answer:");Serial.println(answer); debugging code in to help you isolate the problem. Mar 10, 2016 at 18:15
• And what does it print? I'd put a "input=5;" in the code before calc(), and then try difft debug printing in calc() until you get something unexpected. Mar 10, 2016 at 18:41
• it prints -113.70 regardless of the input @DaveX Mar 10, 2016 at 18:42
• What I have found useful, is testing complex algorithms in a spreadsheet or small console application (even not so complex ones). Once I get them working, I convert to Arduino code, which is pretty straightforward. This is not a warranty of bug-free code but it's pretty close. Mar 10, 2016 at 18:54
• Again, do you want to clear num1 twice or did you intend to clear num2 after the processing. Mar 10, 2016 at 20:19

You're getting the same value every time because that is the value that is being calculated.

I think you have something wrong with how you have implemented your formula. If you start from "answer = " and repeatedly substitute the variables with the formulae or values that make up those variables you end up with this:

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

There's nothing variable about that at all.

Your input value is being used to calculate `batterymoment`. `batterymoment` us being used to calculate `totalmoment`. `totalmoment` is being used to calculate `wheelmoment`. `wheelmoment` is being used to calculate `cgwheels`. `cgwheels` is never used for anything.

Change calc() to be:

``````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;