私が製品を持っている場合:
float d = ( a * b * c );
そして、それはいくつかの最大サイズ (私の例では e) を超えています。どうすれば a、b、c の項を縮小して収まるようにできますか?
if ( d > e )
{
// reduce a, b and c by some fixed percentage, such that ( a * b * c ) == e
}
それはおそらく本当に簡単ですが、私はそれを理解することはできません!
私が製品を持っている場合:
float d = ( a * b * c );
そして、それはいくつかの最大サイズ (私の例では e) を超えています。どうすれば a、b、c の項を縮小して収まるようにできますか?
if ( d > e )
{
// reduce a, b and c by some fixed percentage, such that ( a * b * c ) == e
}
それはおそらく本当に簡単ですが、私はそれを理解することはできません!
全体の比率の立方根でそれぞれをスケーリングします。
fac = exp(log(e/d)/3)
a *= fac
b *= fac
c *= fac
#include <math.h>
…
double scale = cbrt(e / d);
float new_a = a * scale;
float new_b = b * scale;
float new_c = c * scale;
new_a * new_b * new_c
上記で計算されたように、正確に ではない場合があることに注意してくださいe
。少し上かもしれません。積を絶対に より下にしたい場合は、次e
のような安全率を取りますscale = cbrt(0.5 * e / d);