こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

最大値に依存した処理の選択について

実数型の変数がa,b,c,d,e,fの6つがあり、その6つの内で例えば、bが一番大きいならば、こうする、というような処理を考えています(たいした問題ではないように見えます)。一番大きいものを選びだすことは簡単です。それをxとします。しかし、a,b,c,d,e,fのどれなのかわかりません。そこで、xとa,b,c,d,e,fを比べていき一致したら”それ”と決定できるのですが、2つの実数間で一致を照合するというのにまずさを感じています。なお、同じものがあったらどうするかという問題はあまり気にしません。先に見つかった方でいいのです。それは見つける順番で工夫できます。2つの実数の一致を検出するのは問題ないのでしょうか。みつからないというのが問題なのですが。当方は科学計算なのでフォートランなのですが、考え方が分かれば別言語の方法でも参考になるので考え方についてよろしくお願いします。そういう意味で処理系に依存した方法でないことを所望しますが。

投稿日時 - 2018-12-22 07:39:47

QNo.9570184

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

単純に
if( b >=a && b >= c && b >= d && b >=e && b >= f ){
ここに処理
}
という書き方もあります。言語はCです。変数の数が数個で固定で、判定しなくてはならないケースも数種類であるなら、これでもいいと思います。

セオリー通りなら、皆さんおっしゃるように、配列を使って、インデックスを保存する。
また、実数の比較に関しては、計算されたものに誤差が生じるということであって、代入されたものの比較には問題がないというのは先の方のおっしゃる通りです。

投稿日時 - 2018-12-26 10:45:23

ANo.4

何らかの計算を行った結果と、別の値を比較する場合、誤差の影響で一致しない可能性があります。

例)
double a, b;
a = 0.1;
b = 0.01;
if (a*a==b) {
printf("OK");
}
↑これは"OK"と表示されるとは限らない。

ただし、単なる代入の場合であれば、誤差の影響はないので、比較しても問題ありません。元々の数値に誤差が含まれる場合(例えば、ソース上で"0.01"と記述しても、実際には0.01ぴったりの値が表現できない、など)であっても、それは代入元の変数も代入先の変数も同じなので、内部データは一致しています。

例)
double a,b;
a = 0.01;
b = a;
if (a==b) {
printf("OK");
}
↑"OK"と表示される

どうしても心配なのであれば、各変数と最大値との差の絶対値を計算し、最小のものを採用すれば間違いないです。

投稿日時 - 2018-12-25 10:43:46

もう一つの案というかアルゴリズム
data[0]={0,a};
data[1]={1,b};
data[2]={2,c};
data[3]={3,d};
と、2重配列にしてしまい、
それ事ソートしてしまう!
例えば"d"が一番大きかった場合にソートした結果は
data[0]={3,d};
となっていれば、「3」番だったのね!とすぐわかります!。

投稿日時 - 2018-12-22 15:12:43

abcdef の配列があるなら、それのINDEX用の配列を
012345 を作成して、シャッフルするのはこっち!
どの言語でも同じですが。
data[0]=a;data[1]=b;data[2]=c;以下略
それと
index[0]=0;index[1]=1;index[2]=2;以下略
を用意
その場合のxは
x=data [ index [ y ] ];
で読み取るようにして、
バブルソートを、indexで行えば、あなたが欲しい最大値の
場所は、あくまで変わらないので、
index [ y ] が一番大きい数/またはソートにより一番小さい数
として求められます。
OKOK?

投稿日時 - 2018-12-22 10:53:10

ANo.1

a~f じゃなく、配列 v[0]~v[5] にデータを持っておけばいい。
こいつから最大値を持つ添え字:indexを求める。

投稿日時 - 2018-12-22 09:39:54

あなたにオススメの質問