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

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

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

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

Q&A

解決済

2回答

263閲覧

floatにおける誤差について

forza

総合スコア21

C

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

0グッド

0クリップ

投稿2019/02/05 13:15

floatの値がどのくらいまで信頼出来るかを調べるためにgの値とifの条件を変えながらプログラムを作っているのですが期待通りの結果が出てきません。
恐らくgの値とifの条件が誤っていると思うのですがどのように修正すれば宜しいでしょうか?

#include <stdio.h> int same( float x, float y ) { if(x<=y) return 1; return 0; } int main(void) { float s = 0.2, t = 0.3, x, y = 0.5; float g; g=0.0001; x = s + t; printf("%f + %f と %f は", s, t, y ); if((x-g)<same( x, y )<(x+g)){ printf("同じ\n"); }else{ printf("異なる\n"); } return 0; }

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

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

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

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

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

kazto

2019/02/05 13:26

「期待通りの結果が出てきません。」について、ご質問者様の期待値はどのような結果か、そしてどう期待はずれの結果になっているかを追記お願いします。
forza

2019/02/05 13:38

ご指摘有難う御座います。「xとyがgの誤差の範囲内にあるのか」の判断をしたく考えておりました。
guest

回答2

0

まず、ifの条件がぐちゃぐちゃです。また、関数sameの意味が不明。

おそらく、こういうことがしたかったんだと思います。「yがxのg近傍に入っている」

C

1 if(x-g<y && y<x+g){

投稿2019/02/05 13:32

otn

総合スコア84555

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

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

forza

2019/02/05 13:36

分かりやすいご説明を有難う御座います。 自分でも行いたいことがぼやっとしていたので納得できました。
guest

0

ベストアンサー

(x-g)<same( x, y )<(x+g) がおかしいですね。
Python だとこういう書き方ができるのですが、Cの場合、まず左辺の (x-g)<same( x, y ) が評価されて、その結果 ret (0 or 1) が ret < <(x+g) と評価されるので期待した通りの不等式評価にはならないでしょう。

c

1int main() 2{ 3 if (0 < 3 < 2) 4 printf("hoge"); // hoge 上のif 条件は成り立ちます。 5}

改善案

浮動小数点数 x, y が近いかどうかは、相対誤差で判断するのが簡単です。

相対誤差は abs(x - y) / abs(x) で定義され、これが tol (小さい値) 以下なら同じと判断します。
abs(x - y) / abs(x) < tol は式変形すると、abs(x - y) < tol * abs(x)

c

1#include <math.h> 2#include <stdio.h> 3 4bool isclose(float x, float y, float tol) 5{ 6 return fabs(x - y) < fabs(x) * tol; 7} 8 9int main() 10{ 11 float s = 0.2f, t = 0.3f; 12 float g = 0.0001f; 13 14 float x = s + t; 15 float y = 0.5f; 16 17 printf("%f + %f と %f は", s, t, y); 18 if (isclose(x, y, g)) 19 printf("同じ\n"); 20 else 21 printf("異なる\n"); 22}

投稿2019/02/05 13:29

tiitoi

総合スコア21956

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

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

forza

2019/02/05 13:40

ご指摘及びご説明を有難う御座います。 お教え頂きました改善案を元に勉強させて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問