• 締切済み

イプシロン値を使った比較関数

先日、↓でイプシロン値の記述方法を質問し、お陰様で一つ賢くなりました・・・ https://okwave.jp/qa/q9625188.html 今回、このイプシロン値を使用して2つの浮動小数点数の比較関数を作ってみました。 ところが、意図した結果になりません(数値により正しく判断できない場合がある) //倍精度浮動小数点数比較関数 //相対誤差内であれば、両者は等しいとする //戻り値 a=bのとき:0 a≠bのとき:0以外 #include <math.h> int CompareDoubleValue(const double a, const double b) { //引数の差の絶対値とイプシロン値を使用した相対誤差を比較する //1と引数の大きい方の数値を比較して、より大きい数値をイプシロン値 //と乗算して相対誤差とする if (fabs(a-b) <= (DBL_EPSILON*fmax(double(1), fmax(a, b)))) return(0); else return(-1) ; } ※fabs():倍精度浮動小数点数の絶対値を求める標準関数 ※fmax():2つの引数(倍精度浮動小数点数)の大きいほうの値を返す標準関数 何が悪いのかわからず困っております。 お教え頂けると幸いです。 よろしくお願いします。

みんなの回答

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

fmax(a,b)のところは、fmax(fabs(a),fabs(b)) では?

black2005
質問者

お礼

ご回答ありがとうございます。 なるほど~、確かに絶対値の大小関係を比較しないとダメですね。 修正してテストしてみます。 アドバイスに感謝致します。

関連するQ&A

  • atof関数って何ですか?

    参考書などを見ると文字列を浮動小数点数(double)に変換するには、atof関数を使いますって書いてあるんですが、文字列を浮動小数点数(double)に変換するってどういう意味ですか? 回答よろしくお願いします。

  • c言語の変数の型について

    浮動小数点数の変数の型ってfloat、double、long doubleがありますよね?(その他もあったら教えてください) doubleはfloatの倍精度らしいですが、倍精度ってのは扱える数字の範囲が2倍なのか有効桁が2倍なのかわからないんで教えてほしいです。ちなみに、doubleとlong doubleの違いも判りません。 あと、これらの変数はprintfで出力するときは最高で8桁までしか出力できないんでしょうか?20桁とかは無理なんですかね?

  • テーブルに小数点以下の値を入れたい場合

    アクセスのテーブルに0.001と入力したい場合、 データ型を数値型にし、 フィールドサイズは 単精度浮動小数点型と倍精度浮動小数点型では どちらを選べばいいのでしょうか? どちらも小数点の入力ができました。

  • データ型について

    VBに限ったことではないのですが、 データ型には、短整数型、整数型、長整数型、単精度浮動小数点数型、倍精度浮動小数点数型といろいろな型がありますが、 整数を扱うなら長整数型、小数も含めて扱うなら倍精度浮動小数点数型 を使えば良いと思うのですが、それにより桁数の小さな短整数型、整数型とかは何のためにあるのでしょうか? あまり大きな値を扱わないときにそちらの型を選ぶメリットは何なのでしょうか?

  • 浮動小数点演算を固定小数点演算へ変換する

    あるプログラムの処理を高速化するために浮動小数点数を固定小数点数に変換したいので、皆様の力を貸してください。 以下のようなプログラムがあります。 ------------------------------------------------------------- #define A 0.105 int main(){ double y; double a,b; double t1,t2 t1 = A * a; t2 = t1 * t1; y = t2 * b; printf("y = %lf\n",y); return 0; } ------------------------------------------------------------- a,bが入力でそれぞれ0~6000,0~0.004の値を取ることが分かっています。また、yは出力であり許容誤差は3以下となっています。 上記のプログラムを固定小数点数で記述しなおすとどのようになりますか。 各変数の型はshortでお願いします。

  • 相対誤差,絶対誤差

    相対誤差,または,絶対誤差が 10^-12以下出なければならない とあるのですが これは小数点第12位に誤差があっても大丈夫ということでしょうか? 13位に誤差があっても大丈夫ということでしょうか? そもそもc言語などのDoubleでそんな桁まで精度が出るのでしょうか? よろしくお願いします

  • ACCESS データ型の一括変更

    ACCESSのデータ型の変更について質問です。 よそからいただいているACCESSファイルがあるのですが、データがテキスト型で入っていまして、数値型(単精度浮動小数点型)に変更し、IIF関数でチェックをしております。(チェックは例えば、テストの点数が90点以上の点をピックアップするなど簡単なものです) ところで、今までテーブルのデザインビューからデータ型を一つ一つテキスト型から数値型(単精度浮動小数点型)へと変更しておりましたが、変更する箇所が多いので、一括して変更できないかと思っております。よろしくお願いします。

  • accessの数値型のフィールドサイズの規定値

    access2003 迄はオートナンバー型も数値型もフィールドサイズは倍精度浮動小数点型が規定値と記憶しております。 access2010ではオートナンバー型は長整数型、数値型は整数型となっています。 周りの環境はAccess2000~Access2010まで混在しています。 規定値を一つにしたいのですが(できれば倍精度浮動小数点型)

  • バイナリから実数を取得したいのですが・・・

    C++にてバイナリデータから倍精度の浮動小数を取得したいと考えています。 バイナリの中にリトルエンディアン形式で倍精度の浮動小数が64ビット幅に収められています。 これをdouble型の変数に代入したいのですが、どうすれば(できれば簡単な方法で)値を代入できるでしょうか? ご教授お願いします。 データのサンプルを念のために記載させて頂きます。 B2 9C 05 DA 7D 40 6C 3F -> 3.448720745086919e-3

  • Accessクエリの整数型と単精度型の演算について

    Accessのクエリで長整数型と単精度浮動小数点型を 加算すると答えが一致しません。理由を知っている人いますか? ちなみに長整数型と倍精度浮動小数点型を加算したときは答えが一致します。 浮動小数点は誤差がつきものなのは分かりますが、 確か単精度浮動小数点型は有効桁数7桁までのはず。 下記の例では問題ないように見えます。 (例)長整数型と単精度浮動小数型の演算:1000+0.20=1000.20000000298 長整数型と倍精度浮動小数型の演算:1000+0.20=1000.2 それではよろしくお願いします。

専門家に質問してみよう