見出し画像

高校数学10分プログラミング(数学Ⅱ編 4.指数関数と対数関数)5日目「常用対数で数の桁数を計算する」解説

マガジンリスト > 数学Ⅱ編 4.指数関数と対数関数 > 5日目 解説

本日の課題、おつかれさまでした。

課題の常用対数を用いて数の桁数を計算するプログラムを作成することができたでしょうか。

解答例

今回の課題の常用対数を用いて数の桁数を計算するプログラムの例を示します。

// 常用対数を計算して桁数を求める
void setup(){

  // (1) 
  int a01 = calc_digits(2.0, 50.0);
  println("(1):", a01,"桁");
  
  // (2)
  int a02 = calc_digits(6.0, 40.0);
  println("(2):", a02,"桁");

  // (3)
  int a03 = calc_digits(12.0, 100.0/3.0);
  println("(3):", a03,"桁");
  
  // (4)
  int a04 = calc_digits(0.5, 100.0);
  println("(4):", "小数第",a04,"位");

  // (5)
  int a05 = calc_digits(0.06, 10.0/3.0);
  println("(5):","小数第",a05,"位");

}

// 底aを持つ対数を計算する関数
float logarithm(
  float a, // 底
  float x  // 真数
){
  return log(x)/log(a);
}

// a^nの桁数を求める関数
int calc_digits(
  float a, // 底
  float n  // 冪指数
){
  // 常用対数を計算する
  float cl = n * logarithm(10.0, a);
  // 常用対数の整数部分
  int int_part = floor(cl);
  int digits;
  if( cl > 0.0 ){
    // a^n はint_part+1 桁の整数
    digits = int_part + 1;
  } else {
    // a^n は小数第 -int_part 位に初めて0が出てくる小数
    digits = -int_part;
  }
  return digits;
}

ソースコード2 数の桁数を計算するプログラム

ソースコード2を、Processingの開発環境ウィンドウを開いて(スケッチ名を「calc_common_logarithms」としています)、テキストエディタ部分に書いて実行すると、コンソールに

(1): 16 桁
(2): 32 桁
(3): 36 桁
(4): 小数第 31 位
(5): 小数第 5 位

と出力されます。


プログラムの解説

calc_digits 関数について
$${N}$$の桁数を算出するためには、$${N}$$の常用対数$${ \log_{10} N}$$を計算します。ただ、プログラムで扱う$${N}$$の値の大きさは今回float型の最大値までしかとれず、それより大きな値は無限大として扱われます。例えば、$${N=10^{50}}$$の整数部分が$${51}$$桁になることは簡単にわかりますが、これをプログラムで

pow(10.0,50.0);

と計算すると、その値は

Infinity

となりますので、プログラムで$${\log_{10} N}$$を

// 常用対数を計算する
float N = pow(10.0,50.0);
float cl = logarithm(10.0, N);

と計算すると、やはり、cl は Infinity となってしまいます。
そこで、関数 calc_digits では、$${N}$$を$${a^n}$$の形で表すことで、常用対数を$${\log_{10} N}$$と計算するのではなく、$${n \log_{10} a}$$として計算するようにしています。

  // 常用対数を計算する
  float cl = n * logarithm(10.0, a);

ヒントのところで『calc_digits 関数は、$${N=a^n}$$という形にして、引数を底$${a}$$と冪指数$${n}$$とを引数に取り』としたのはそのためです。

calc_digits 関数の残りの部分は、桁数と対数で説明したことを参考にしてコーディングしていくだけになります(ソースコード2参照)。


桁数の計算
あとは、setup 関数内で各課題に合わせて calc_digits 関数を呼び出すことで数の桁数を計算することができます。ただ、課題(3)と(5)については、

(3) $${ \sqrt[3]{ 12^{100} }= (12)^{\frac{100}{3}} }$$
(5) $${ \sqrt[3]{ (0.06)^{10} } = (0.06)^{\frac{10}{3}} }$$

と変形できることを利用して桁数の計算を行っています。


本日は以上です。
次回からは、微分法や積分法について考えていきます。

次回もよろしくお願いします。


読んだ感想などをお寄せください

本記事を読んだ感想や質問などを以下のお問い合せフォームからお寄せください。(お問合せフォームの本文に、本記事のタイトルを入れてください。)


MK’s papa

いいなと思ったら応援しよう!