# 大規模な算術を正しく処理する方法

たとえば、私はこのコード機能のセットアップを持っています：

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

}
``````

どんな指導も高く評価されます。ありがとう。

コード全体は次のとおりです。

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

したがって、ユーザーの入力に応じて、計算によって最終出力の回答が変更されます。たとえば、5を入力する必要がある場合、出力はExcelでの計算に基づいて-4.22になります。

0

そしてそれは何を印刷しますか？私は "入力= 5;" calc（）の前のコードで、そして予期しないことがあるまでcalc（）でdifftデバッグ印刷を試してください。

@DaveXの入力に関係なく-113.70を出力します

## 2 答え

それは計算されている値なので、毎回同じ値を得ています。

（14.3 - （12404 - 4401））+（11.4 - （（4401 * 14.164）+（（（12404-4401） （12404 - 4401 - 1.8）/（（12404 - 4401 - 1.8）+（14.3 - （12404~4401））））））/ 2）* 1.8））/ 12404））/ 22.65

それについて何も変わりはありません。

あなたの入力値は` batterymoment `の計算に使用されています。 ` totalmoment `の計算には` batterymoment `を使用します。 ` wheelmoment `の計算に` totalmoment `が使用されています。 ` 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;