【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19429

数値がちがう
投稿者---IYOIYO(2005/01/24 02:55:20)


連続投稿失礼します。ソースのことで質問したいと思ってので
新規に投稿させていただきました。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define N 3
#define E .00001

int main(void)
{
double a[N][N]={
              {2,1,1},
              {2,3,1},
              {1,1,3}};
double b[N] ={2,4,-1};
double x[N],r[N],s,q;
int m=100;
int k,i,j;

for(i=0; i<N; i++)
x[i]=0;
for(k=1; k<=m; k++){
for(i=0; i<N; i++){
r[i]=x[i];
for(i=0; i<N; i++){
s=0;
for(j=0; j<N; j++){
if(i !=j)
s +=a[i][j]*x[j];
}
x[i]=(b[i]-s)/a[i][i];
}
q=0;
for(i=0; i<N; i++)
q += fabs(x[i]-r[i]);
if(q<E){
printf("N=%d\n\n",N);
printf("COEFFICIENT\n");}
for(i=0; i<N; i++){
for(j=0; j<N; j++)
printf("%.2f",a[i][j]);
            
printf("\n");
}
printf("\nCONSTANT\n");
for(i=0; i<N; i++)
printf("%.2f",b[i]);
printf("\n\n SOLUTION\n");
for(i=0; i<N; i++)
printf("%f\n",x[i]);
printf("\nK=%d",k);
printf("\nE=%f\n",E);
return 1;
}
}
return 0;
}



上のソースは,反復法の計算ですが
Vc++.net では結果が
N=3

COEFFICIENT
2.001.001.00
2.003.001.00
1.001.003.00

CONSTANT
2.004.00-1.00

SOLUTION
1.000000
0.666667 
-0.888889

K=1
E=0.000010
になるのでが,UNIX
N=3

COEFFICIENT
2.001.001.00
2.003.001.00
1.001.003.00

CONSTANT
2.004.00-1.00

SOLUTION
1.000001
0.999999
-1.000000
K=13
E0.000010

と数値が違いました。コンパイルが出来たので文法の間違いは
ないと思うのですが,原因がわかりません。よろしくおねがいします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> 一部訂正します 19430 IYOIYO 2005/01/24 03:07:00
<子記事> Re:数値がちがう 19431 あかま 2005/01/24 03:12:31


No.19430

一部訂正します
投稿者---IYOIYO(2005/01/24 03:07:00)


#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define N 3
#define E .00001

int main(void)
{
double a[N][N]={
              {2,1,1},
              {2,3,1},
              {1,1,3}};
double b[N] ={2,4,-1};
double x[N],r[N],s,q;
int m=100;
int k,i,j;

for(i=0; i<N; i++)
x[i]=0;
for(k=1; k<=m; k++){
for(i=0; i<N; i++){
r[i]=x[i];
for(i=0; i<N; i++){
s=0;
for(j=0; j<N; j++){
if(i !=j)
s +=a[i][j]*x[j];
}
x[i]=(b[i]-s)/a[i][i];
}
q=0;
for(i=0; i<N; i++)
q += fabs(x[i]-r[i]);

printf("N=%d\n\n",N);
printf("COEFFICIENT\n");
for(i=0; i<N; i++){
for(j=0; j<N; j++)
printf("%.2f",a[i][j]);
            
printf("\n");
}
printf("\nCONSTANT\n");
for(i=0; i<N; i++)
printf("%.2f",b[i]);
printf("\n\n SOLUTION\n");
for(i=0; i<N; i++)
printf("%f\n",x[i]);
printf("\nK=%d",k);
printf("\nE=%f\n",E);
return 1;
}
}
return 0;
}


 失礼しました


この投稿にコメントする

削除パスワード

No.19434

Re:一部訂正します
投稿者---ぽへぇ(2005/01/24 06:41:46)


>for(i = 0; i < N; i++){
>   r[i] = x[i];
>   for(i = 0; i < N; i++){
どうして i を上書きするのですか?
CC と VC の違い以前の問題です。

>になるのでが,UNIX
>K=13
本当ですか? ソースが違うということはありませんか?




この投稿にコメントする

削除パスワード

No.19431

Re:数値がちがう
投稿者---あかま(2005/01/24 03:12:31)


doubleなどの実数型は誤差がでますからそれが原因では?
浮動小数点という方法で内部では表現されているのですが、
その表現の仕方が違うとか、ビット数が違うなど、誤差の出る原因が考えられます。

あまりに大きな誤差の時はプログラムが怪しいです。


「HTML変換ツール」を使ってあっても字下げされてないのは意味がない。


この投稿にコメントする

削除パスワード

No.19432

Re:数値がちがう
投稿者---IYOIYO(2005/01/24 05:57:46)


おはやい,レスありがとうございます。

>doubleなどの実数型は誤差がでますからそれが原因では?
>浮動小数点という方法で内部では表現されているのですが、
>その表現の仕方が違うとか、ビット数が違うなど、誤差の出る原因が考えられます。
それってもしかして,コンパイラが違うためなのでしょか?

>あまりに大きな誤差の時はプログラムが怪しいです。
UNIXだと
K=13
Visual c++.netだと
K=1
な,なぜ?わからないです。助言お願いします。
>「HTML変換ツール」を使ってあっても字下げされてないのは意味がない。
申し訳ないです。字下げの意味がわからないです。全角スペースがあるということでしょか?


この投稿にコメントする

削除パスワード

No.19436

Re:数値がちがう
投稿者---ぽへぇ(2005/01/24 07:02:13)


これが「字下げ」ということです。
制御構造が分かりやすくなったと思いませんか?

>それってもしかして,コンパイラが違うためなのでしょか?
UNIXの実行環境がないので動作確認はできませんが、
コンパイラを疑う前に自分のプログラムを疑いましょう。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define N 3
#define E .00001

int main(void)
{
    double a[N][N]={
        {2,1,1},
        {2,3,1},
        {1,1,3}};

    double b[N] ={2,4,-1};
    double x[N],r[N],s,q;
    int m=100;
    int k,i,j;

    for(i=0; i<N; i++)
        x[i]=0;
    for(k=1; k<=m; k++){
        for(i=0; i<N; i++){
            r[i]=x[i];
            for(i=0; i<N; i++){
                s=0;
                for(j=0; j<N; j++){
                    if(i !=j)
                        s +=a[i][j]*x[j];
                }
                x[i]=(b[i]-s)/a[i][i];
            }
            q=0;
            for(i=0; i<N; i++)
                q += fabs(x[i]-r[i]);

            printf("N=%d\n\n",N);
            printf("COEFFICIENT\n");
            for(i=0; i<N; i++){
                for(j=0; j<N; j++)
                    printf("%.2f",a[i][j]);
                printf("\n");
            }
            printf("\nCONSTANT\n");
            for(i=0; i<N; i++)
                printf("%.2f",b[i]);
            printf("\n\n SOLUTION\n");
            for(i=0; i<N; i++)
                printf("%f\n",x[i]);
            printf("\nK=%d",k);
            printf("\nE=%f\n",E);
            return 1;
        }
    }
    return 0;
}




この投稿にコメントする

削除パスワード

No.19437

Re:数値がちがう
投稿者---IYOIYO(2005/01/24 07:37:33)


制御構造が分かりやすくなったと思いませんか?
おお!みやすい!なるほど,見やすくするための技法だったのですね。

 それと,ありました,ソースに問題が……
My PCちゃん,疑ったり,頭叩いたりしてごめんよ。
私が悪かった(´Д`)

しかし,間違っているにも関わらずコンパイルできてしまうなんて
(文法上では大丈夫なのでしょけど)
このことでC言語の恐ろしさというもの学べた気がします。

あかまさん,ぽへぇさん
レスありがとうがざいます。

ぽへぇさんにいたっては一度ならず二度まで助けていただいて
本当に感謝します。
 このソースではないですが,別のソースではご指摘いただいた
通りにやってみたら動作しました。
 これで,足取り軽く仕事にいけます。(笑
本当にありがとうございました。m(__)m


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧