累乗根の除算

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
echoecho

累乗根の除算

#1

投稿記事 by echoecho » 7年前

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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 累乗根の除算

#2

投稿記事 by みけCAT » 7年前

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
echoecho さんが書きました:割り算のほうがうまくいきません。どうすればいいか教えてください。
後半(割り算)の計算において、
・ループに入る前にansを443に初期化する処理を追加する
・ans=ans*y;の代わりにans=ans/y;をする
という修正をするとよさそうだと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

echoehco

Re: 累乗根の除算

#3

投稿記事 by echoehco » 7年前

回答ありがとうございます。
無事、答えを出すことができました。
また、このサイトを使うのは初めてなのですがソースコードの張り方など丁寧に教えてくださりありがとうございます。

echoecho

Re: 累乗根の除算

#4

投稿記事 by echoecho » 7年前

回答ありがとうございます。
無事、答えを出すことができました。
また、このサイトを使うのは初めてなのですがソースコードの張り方など丁寧に教えてくださりありがとうございます。

かずま

Re: 累乗根の除算

#5

投稿記事 by かずま » 7年前

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

返信

“C言語何でも質問掲示板” へ戻る