ページ 11

累乗根の除算

Posted: 2018年1月22日(月) 02:01
by echoecho
443*2^(1/12)と443/2^(1/12)の計算をそれぞれ10回ずつ繰り替えしたいのですが割り算のほうがうまくいきません。どうすればいいか教えてください。

ソースコード

#include <stdio.h>
#include <math.h>

int main(void)
{
double ans=443,i;
double x = 2.0; // 基数
double y = 0;
double a = 1.0/12.0; // 指数

y = pow(x, a);// べき乗の計算(y=x^a)

printf("%f\n",y);

printf("ラより上の音域\n");
for(i=0;i<10;i++){
printf("ans=%f\n", ans*y); // 計算結果の表示
ans=ans*y;
}

printf("ラより下の音域\n");
for(i=0;i>-10;i--){
printf("ans=%f\n", ans/y); // 計算結果の表示
ans=ans*y;
}

return 0;
}

実行結果

1.059463
ラより上の音域
ans=469.342151
ans=497.250687
ans=526.818752
ans=558.145025
ans=591.334055
ans=626.496608
ans=663.750035
ans=703.218666
ans=745.034224
ans=789.336264
ラより下の音域
ans=745.034224
ans=789.336264
ans=836.272641
ans=886.000000
ans=938.684302
ans=994.501375
ans=1053.637504
ans=1116.290050
ans=1182.668111
ans=1252.993216

Re: 累乗根の除算

Posted: 2018年1月22日(月) 02:09
by みけCAT
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
echoecho さんが書きました:割り算のほうがうまくいきません。どうすればいいか教えてください。
後半(割り算)の計算において、
・ループに入る前にansを443に初期化する処理を追加する
・ans=ans*y;の代わりにans=ans/y;をする
という修正をするとよさそうだと思います。

Re: 累乗根の除算

Posted: 2018年1月22日(月) 03:11
by echoehco
回答ありがとうございます。
無事、答えを出すことができました。
また、このサイトを使うのは初めてなのですがソースコードの張り方など丁寧に教えてくださりありがとうございます。

Re: 累乗根の除算

Posted: 2018年1月22日(月) 03:13
by echoecho
回答ありがとうございます。
無事、答えを出すことができました。
また、このサイトを使うのは初めてなのですがソースコードの張り方など丁寧に教えてくださりありがとうございます。

Re: 累乗根の除算

Posted: 2018年1月22日(月) 07:17
by かずま
i は double よりも int の方が良いでしょう。
回数をカウントするだけなので、負の値にする必要はありません。
なぜ、ラの上下 10音なのでしょう?
12音にして、1オクターブで 2倍と半分になることを見せればいいのに。

コード:

#include <stdio.h>  // printf
#include <math.h>   // pow

int main(void)
{
    int i;
    double ans = 443;
    double y = pow(2, 1.0/12); 

    printf("半音の倍率\n" "%12f\n", y);

    printf("ラの音\n" "%12f\n", ans);

    printf("ラより上の音域\n");
    for (i = 0; i < 12; i++) {
        ans *= y;
        printf("%12f\n", ans); // 計算結果の表示
    }
   
    ans = 443;
    printf("ラより下の音域\n");
    for(i = 0; i < 12; i++) {
        ans /= y;
        printf("%12f\n", ans); // 計算結果の表示
    }
  
    return 0;
}
実行結果

コード:

半音の倍率
    1.059463
ラの音
  443.000000
ラより上の音域
  469.342151
  497.250687
  526.818752
  558.145025
  591.334055
  626.496608
  663.750035
  703.218666
  745.034224
  789.336264
  836.272641
  886.000000
ラより下の音域
  418.136321
  394.668132
  372.517112
  351.609333
  331.875018
  313.248304
  295.667028
  279.072513
  263.409376
  248.625344
  234.671075
  221.500000