質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

4028閲覧

3次元ベクトルの内積計算のforの使い方

madomado0011

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/12/15 13:04

編集2020/12/15 13:13

前提・実現したいこと

3次元ベクトルa、bの内積を求めたいです(a,bはそれぞれ入力する)

発生している問題・エラーメッセージ

最後の計算のところでforを利用したいのですがどこが間違っているでしょうか。double naisekiの隣にConflicting types for 'naiseki'というエラーが出てしまいます。 #include <stdio.h> double naiseki(double veca[],double vecb[]); int main (void) { double veca[3],vecb[3],naiseki; int i; printf("ベクトルaの各値を入力せよ"); for(i=1;i<=3;i++){ scanf("%lf", &veca[i-1]); printf("a[%d] %f",i,veca[i-1]); } printf("\n"); printf("ベクトルbの各値を入力せよ"); for(i=1;i<=3;i++){ scanf("%lf", &vecb[i-1]); printf("b[%d] %f",i,vecb[i-1]); } printf("\n"); printf("内積は%fです",naiseki) return 0; } double naiseki(double veca[], double vecb[],int n) { int i; double ans; for (i=0;i<=3;i++) { ans = ans + veca[i]*vecb[i]; } return ans; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/12/15 13:06

エラーが出るならエラーメッセージを提示しましょう
guest

回答2

0

関数naiseki内の変数ansの初期値が0ではないのが
計算結果に問題が出る原因です。

変数は定義しただけでは初期化されないので
手動で初期化する必要があります。

diff

1-double naiseki(double veca[], double vecb[],int n) 2+double naiseki(const double veca[], const double vecb[]) 3{ 4 int i; 5- double ans; 6+ double ans = 0.; 7 8- for (i=0; i<=3; i++) 9+ for (i=0; i<3; ++i) 10 { 11 ans = ans + veca[i]*vecb[i]; 12 } 13 return ans; 14}

ちなみに余談ですが上記コードでは内積関数の内部の総和部分で
情報落ちで発生する誤差が蓄積されてしまう問題
への対策が行われていないので下記コードのような
状況で誤差によりおかしな結果となってしまいます。

c

1#include <stdio.h> 2 3double naiseki(const double veca[3], const double vecb[3]) 4{ 5 double ans = 0.; 6 for(unsigned i=0; i<3; ++i) ans += veca[i] * vecb[i]; 7 return ans; 8} 9 10int main() 11{ 12 double vec1[] = {10000000000000000., 1., 1.}; 13 double vec2[] = {1., 1., 1.}; 14 15 double result = naiseki(vec1, vec2); 16 17 printf("%lf\n", result); 18 /*-------------------------------------------- 19 結果 :10000000000000000.000000 20 予想した結果 :10000000000000002.000000 21 情報落ちにより誤差が発生 22 *///------------------------------------------ 23}

なのでカハンの加算アルゴリズムを用いて
誤差を抑えたコードのほうが適切かもしれません。

c

1#include <stdio.h> 2 3// 4// カハンの加算アルゴリズムを用いた内積 5// 6double naiseki_kahan(const double veca[3], const double vecb[3]) 7{ 8 double y, t; 9 double sum = 0.; 10 double loss = 0.; 11 12 for(unsigned i = 0; i < 3; ++i){ 13 y = veca[i] * vecb[i] - loss; 14 t = sum + y; 15 loss = (t - sum) - y; 16 sum = t; 17 } 18 return sum; 19} 20 21// 22// 通常の内積 23// 24double naiseki(const double veca[3], const double vecb[3]) 25{ 26 double ans = 0.; 27 for(unsigned i=0; i<3; i++) ans += veca[i] * vecb[i]; 28 return ans; 29} 30 31int main() 32{ 33 double vec1[] = {10000000000000000., 1., 1.}; 34 double vec2[] = {1., 1., 1.}; 35 36 double result = naiseki(vec1, vec2); 37 double result_kahan = naiseki_kahan(vec1, vec2); 38 39 printf("use normal :%lf\n", result); 40 printf("use kahans sum :%lf\n", result_kahan); 41 42 /*-------------------------------------------- 43 use normal :10000000000000000.000000 44 use kahans sum :10000000000000002.000000 45 *///------------------------------------------ 46}

投稿2020/12/15 18:42

編集2020/12/15 23:00
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2020/12/16 03:40

(投じた高評価は,質問への回答部分ではなく「余談」の側に対する.)
guest

0

s = s + veca[i]*vecb[i];

sという変数が未定義です
#他にもいろいろツッコミどころがありそうですが


そのエラーは、naisekiという名前の関数が、プロトタイプ宣言と食い違っているためにでているエラーです
双方記述を揃えておこうw(修正)
#それでもコードはダメだけど

投稿2020/12/15 13:09

編集2020/12/15 13:22
y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問