プロが教える店舗&オフィスのセキュリティ対策術

線形補間での求め方
問題文:
1.数値を読み込む
2.xを読み込む
3.x<x1 または x>xnならエラー
3.x1<x<i+1 となるiを見つける
4.補間公式でyを求める
5.結果をプリントする

#include<stdio.h>
float hokan(void);
int xn[] = {0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75};
double yn[] = {0.000,0.087,0.173,0.258,0.342,0.422,0.500,0.573,
0.624,0.707,0.766,0.819,0.866,0.906,0.939,0.965};
int x=5;
void main()
{
printf("y = %lf\n", hokan());
}
float hokan(void)
{
int i;
double y;

if(x <0|| 75<= x){
printf("エラーです\n");
}
else{
for(i=0; xn[i] < x; i++)
y = (yn[i+1] - yn[i]) * (x - xn[i]) / (xn[i+1] - xn[i]) + yn[i];
return y;
}
}

数表を最初にxnとynで表記しています。
このプログラムで線形補間が行われてないそうなのですが・・
何か誤りがある様でしたらどなたか教えてください。

A 回答 (2件)

>数表を最初にxnとynで表記しています。


>このプログラムで線形補間が行われてないそうなのですが・・

 どなたかに言われたのですか?。

 その方は、x = 5; と「数表」にある既知の値(線形補間不要)を用いているから、そのことを揶揄して言ったのでは・・。
 
☆ご自分で、「数表」にない値(例えば、x = 3 )で実行し、電卓での結果と比較してみては如何でしょう。
    • good
    • 0
この回答へのお礼

恥ずかしながら・・課題提出の時に言われました。
もう期限は過ぎてるのですが、一応完全な形で出しておきたいと思い
こちらに質問させていただきました。

最初の方と一緒にあわせて考えてみます。
ありがとうございます

お礼日時:2008/06/25 17:10

まずプログラムのことに関してですが、x,xn[]とy,yn[]でサイズが異なるのですが、計算上危険なようなのでキャストするなりして型を統一したほうがいいです。


hokan()戻り値の設定がfloatで宣言しているのに、double型で返したら期待する結果は戻ってきません。

型とかを無視して机上で計算した結果は0.087でしたが、bubunnさんの実行結果はどうでしたか?

この場合ですが、x==5ということもありループ内の処理は配列の要素が[0]の時だけしか動いていません。

継続条件:xn[i]<x
1回目 0<5なので成立→補間計算。
2回目 5<5なので不成立→ループ内の処理は行われず最後のyの値にてリターン。

配列のiは0しか実行できないのでyn[0]==0.000ですしxn[0]==0です。
したがって(型は無視します。)計算すると
y=(0.087-0)*(5-0)/(5-0)+0.000
計算式の優先度順に計算すると
y=0.435/5+0.000
y=0.087+0.000
y=0.087
となります。
もしこれ以外の結果になる場合はdoubleとintの型が合っていないので想定し得ない結果になっているという理由です。(理由は処理系内では10進で演算していないためです。)

まずは型の見直し、補間条件x=5が妥当か?調べてみてください。
    • good
    • 1
この回答へのお礼

そういう意味なのですね。
ありがとうございます!

お礼日時:2008/06/25 17:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!