2016-03-26 10 views
-2

私はC++でこの方程式を解こうとしています。BigNum/BigIntクラスC++で1 /(1/r1 + 1/r2)を解く

enter image description here

I長い長のサイズ制限に起因BigNumクラスをしなければならなかった値の範囲に対応するために。現在、私のBigNumクラスは整数だけをサポートしています。この方程式を整数だけで解くことはできますか?

コード

BigNum Parallel::getResistance(Resistor &r1, Resistor &r2) { 
// TODO: Improve formatting of this 
BigNum one("1"); 
BigNum bottom(
    one.divide(r1.getResistance()) 
    .add(
    one.divide(r2.getResistance())) 
    .toString()); 
BigNum resistance (one.divide(bottom).toString()); 
return resistance; 
} 

そして

/** 
MUST HAVE A DENOMINATOR IN LONG LONG RANGE... 
todo: update this function to handle values outside of long long range 
*/ 

BigNum BigNum::divide(BigNum &bn) { 
    string n = toString(); 
    long long den = stoll(bn.toString()); 
    long long rem = 0; 
    string result; 
    result.resize(MAX); 

    for (int indx = 0, len = n.length(); indx<len; ++indx) { 
     rem = (rem * 10) + (n[indx] - '0'); 
     result[indx] = rem/den + '0'; 
     rem %= den; 
    } 
    result.resize(n.length()); 

    while (result[0] == '0' && result.length() != 1) 
     result.erase(0, 1); 

    if (result.length() == 0) 
     result = "0"; 


BigNum num(result); 
return num; 
} 

誰もがhere is a link to the full project関心がある場合。

+2

対処しなければならない抵抗の量に対して「長い間」(すなわち、19桁の大きさ)が不十分なモデリングはどのような回路ですか? –

+4

@OliverCharlesworth:実際の質問は浮動小数点型を使用しない理由です( 'float'で十分でしょう)?抵抗値が0.001%の抵抗は、あまり使用されていないため、中間結果に 'double 'を使用すると、累積誤差でも問題はありません。私はこれを過剰設計したと呼ぶだろう。 – Olaf

+1

そして、[完璧に良いライブラリ](https://gmplib.org/)があると、あなた自身がなぜロールを張るのですか? –

答えて

0

@OliverCharlesworthの洞察のため、データを符号なしlong longに変更しました。 また、@Olafによって提案されたように、計算をフロートとして実行しました。

unsigned long long Parallel::getResistance(Resistor &r1, Resistor &r2) { 
    return 1.0/(1.0/r1.getResistance() + 1.0/r2.getResistance()); 
} 
関連する問題