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: 累乗根の除算
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
・ループに入る前にansを443に初期化する処理を追加する
・ans=ans*y;の代わりにans=ans/y;をする
という修正をするとよさそうだと思います。
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
後半(割り算)の計算において、echoecho さんが書きました:割り算のほうがうまくいきません。どうすればいいか教えてください。
・ループに入る前にansを443に初期化する処理を追加する
・ans=ans*y;の代わりにans=ans/y;をする
という修正をするとよさそうだと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 累乗根の除算
回答ありがとうございます。
無事、答えを出すことができました。
また、このサイトを使うのは初めてなのですがソースコードの張り方など丁寧に教えてくださりありがとうございます。
無事、答えを出すことができました。
また、このサイトを使うのは初めてなのですがソースコードの張り方など丁寧に教えてくださりありがとうございます。
Re: 累乗根の除算
回答ありがとうございます。
無事、答えを出すことができました。
また、このサイトを使うのは初めてなのですがソースコードの張り方など丁寧に教えてくださりありがとうございます。
無事、答えを出すことができました。
また、このサイトを使うのは初めてなのですがソースコードの張り方など丁寧に教えてくださりありがとうございます。
Re: 累乗根の除算
i は double よりも int の方が良いでしょう。
回数をカウントするだけなので、負の値にする必要はありません。
なぜ、ラの上下 10音なのでしょう?
12音にして、1オクターブで 2倍と半分になることを見せればいいのに。
実行結果
回数をカウントするだけなので、負の値にする必要はありません。
なぜ、ラの上下 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