● メモリーの使用状況

 さて、自動アロケーターはどのように動作していて、メモリーをどのくらい使用しているのでしょうか? 階乗の計算プログラムをちょっと変えて、メモリーの使用状況を報告させるようにしました。 24 の階乗を計算させた、経過を報告します。

 関数 fact_digits は n! の近似値をスターリングの公式で求め、その 10 進桁数を表示します。 関数 fact_value は n! の値を mpz_t 型変数で計算し、値を表示するとともに limb をいくつ使用しているか報告します。

 ソースプログラム


実行結果:

mp_bits_per_limb 32        <* limb のビット数は 32 でした
3: n! approx = 5.83621, 1 digits <* n! 概略値と 10 進桁数
6 (1 limbs, 32 bits)       <* n! の値、limb 使用数、bit 数
4: n! approx = 23.5062, 2 digits
24 (1 limbs, 32 bits)
5: n! approx = 118.019, 3 digits
120 (1 limbs, 32 bits)
6: n! approx = 710.078, 3 digits
720 (1 limbs, 32 bits)

(中略)

21: n! approx = 5.08886e+19, 20 digits
51090942171709440000 (3 limbs, 96 bits)
22: n! approx = 1.11975e+21, 22 digits
1124000727777607680000 (3 limbs, 96 bits)
23: n! approx = 2.57585e+22, 23 digits
25852016738884976640000 (3 limbs, 96 bits)
24: n! approx = 6.18298e+23, 24 digits
620448401733239439360000 (3 limbs, 96 bits)

 ここで、mpz_size(result) と result[0]._mp_alloc を直接表示させた値が食い違っているのですが、原因を深くは追求していません。 result[0]._mp_alloc == mpz_size(result) + 1 になります。


  Top に戻る