【プログラミング】浮動小数点の比較方法について教えてくれ
■ このスレッドは過去ログ倉庫に格納されています
>>6
入力値が最大値を越えてないかチェックする感じ
999.9までみたいな
そのとき浮動小数点の比較ってどうなんって話になった 浮動小数点の値は仮数×2の何乗かでしか表せないから
0.1とか0.2は割り切れない値になるのはわかる イプシロンって要は
1×2のマイナス(指数部分のビットの最大値)乗なんでしょ
つまりプログラミングの浮動小数点で表せる値=イプシロンの倍数ってこと?
これ違う? ふつうに<で比較すりゃいいんじゃないの?
それとも内部でどういうふうに処理されるかって話? これって要は変数の持ってるビット数によってイプシロンの値が変わるってだけでしょ?
指数のビット数が多いだけ細かく刻める的な
https://i.imgur.com/ytWYyBK.jpg >>8
テストコード書けよ
validate(1000) == true
validate(999.9) == false
を満たすvalidate関数を作りたいってこと? >>15
それは良くないんだ
誤差があるからそこを考慮しないといけない
その計算式のテンプレートはあるけどただコピペするんじゃなくて中身を理解しろと言われた >>18
トゥルーフォルスは逆だけどね
999.9までで999.91はアウトみたいな感じにしたいと思った
まあ実際の処理で浮動小数点の比較やるのやめたけどこの勉強自体はしとけと
CしかわからんからCっぽく書いてくれると嬉しい >>20
それ使う必要ある?
探してくれたのは嬉しいけどあんま関係ないような >>22
イプシロン言うから精度足りてるか判断必要かと思ったけど、十進6桁までなら単精度浮動小数点で足りるので不要 なるほど999.9 >= x って書くとだめなんだろうな >>25
二進数の仮数と指数で表す数値が浮動小数点
この変換逆変換が自分の頭で出来ないなら会話が成立しない C専門じゃないけど
999.9 + epsilon => x ってやるのかな
それかイプシロン以上で十分小さい数を足して比較する そもそも小数が1/2のべき級数の和で表現されるっていう基本を理解できてんのか? >>28
そら出来るけど…
>>12ここでゆーてるし
精度の話って今回関係あるのかなあ?
フロートでもダブルでもイプシロンはそれぞれあるし
使う変数が変わることで計算方法に変化はしないでしょ? >>29
多分それじゃダメっぽいね
>>14こう考えたけど仮数部分の桁数も有限だから倍数全ては扱えんな >>24
これが正解だと思う
少数やめて整数にすれば分かる まずどんな目的で小数点の比較をやりたいんだ
実装なんてユースケースによるだろ
精度低めでいいなら比較する数同士をN倍して小数点切り捨てて比較が一番楽
とはいえ浮動小数点数同士の比較はハードウェアによって演算結果が変わるから基本的にはこの手法だと思う >>30
小数って言うと誤解招くでしょ
計算機小数点数でしょ
人間が書く小数なら全然ちゃうわ >>33
あのさあ…
まあ今回は有効桁数ってのがあるからいいけど、そこが決まってない値だと困るよね
999.99999999999999999999999をどうやって判定するか >>35
おっしゃる通りだけど、このスレの文脈でそれ以外ありえねえのに面倒な揚げ足取りしてくるタイプとは思わんかったわ >>34
精度高くても小数の比較を扱えるようにしたい
なんかテンプレの計算式ってのがあるんでしょ?
あれ説明できるくらいになりたい >>37
流石に小数ってってのは誤解を招くよ
プログラミングでのとかフロートダブル型はって言わんとね 不動小数点なんでしょ?任意精度じゃなくて
何がしたいのか分からん 人に説明できるくらい勉強して来いが課題だから非常に面倒 >>45
人に聞くことも勉強でしょうが…
休日なのにやらんでもいいんだけど仕事中に調べてもようわからんから休みの今聞いてるの
偉いじゃん? ITパスポート持ちの俺が教えてあげる
符号部、指数部、仮数部のbitで比較すればOK! とりあえず与えられてる数値が上に下に何桁あろうが
それを10桁ぐらい切り取ってintにして比較したらいうじゃん
1億桁あるなら1000万回比較するだけだぞ? >>31
四則演算ならフル精度で求まる
関数の制度は環境による
FMAで乗算と加算が同時じゃないと問題になる演算系もあるらしい
2値を引いた結果やゼロ除算チェックでイプシロンを有効範囲にしたりする >>49
そうなってるんだ
そこら辺理由もつけて説明してくれるとありがたい >>51
関数ってのは級数展開で出来るだけ多く求めると精度が出る
浮動小数点ユニットが生まれてからの歴史でも数学の発展で劇的に処理が高速化されている
たとえばsqrtは逆数のRecipSqrtの方が単純な計算になる、逆数はテーブル処理、単精度であれば2回処理して逆数で求まる
4回計算すれば倍精度、高速化して半精度で良いなら一回の計算といった内部処理 イプシロンとか有効桁数とかめちゃくちゃ単純な話をさも難しいかのように表現してるレスには同意して簡単に説明してるレスには反発してるだけじゃん 10倍して符号付き整数にキャストして9999と比較じゃダメなのか? >>52
難しい単語使わないでもっと分かりやすく説明して(^-^;💦 >>55
ダメ
浮動小数点の比較をやれと言われてる 例えば
double x=0.1;
double y=0.2;
y/=2;
こう計算するとx=yにならんのでしょ?
そこら辺が面倒 >>61
日本語じゃないじゃん…
簡単な用語で説明するくらい詳しくないん…? そもそも比較をやれってリクエストがいまいちピンとこないんだけど、マシンイプシロンを測定するコードを書いて説明しろって意図? >>64
例えば>>60みたいな計算があったとして誤差の範囲を求めてx==yの判定がトゥルーになるようにコード組んで説明しろってことかなあ
ぶっちゃけ
>>41だからなあ >>65
それで言うと実務では必要な精度が要件として定義されているはずなので、差の絶対値がそれ以下ならtrueってやるのが普通だよね
数値計算やってる人であれば、誤差の範囲を求めて限界まで〜ってのも分かるけど……
業種は何なの? >>59
状況概ね把握した
出題者に「何が知りたいのかはっきりさせろ」って回答しておけ (0.1)^nで比較するのも
10^n倍して計算するのも同じこと
fewEqual = (a, b) => abs(a - b) <= X
比較対象を求める演算の過程で起こりうる誤差の値をxにするか
毎回しっかり丸め込めばいいんじゃないの 最初に戻るけど人に説明するなら2進の仮数と指数にして手計算
手計算面倒なので変換器で出た内容を可視化するだけで良い
プログラムの実コードなら共用体とビットフィールドで変換器を自前実装してれば納得してもらえる 俺も>>69だと思うけどな
ただ、計算を繰り返したときに誤差の蓄積が発生するようなケースをいかに回避するか?みたいな話には踏み込めてないけど別に良いのかな
あと、何かの関数の値を求めるときに級数展開が利用されていて、その切り捨てに伴う誤差の話題にも触れられないよな >>70
誤差関連は仮数に対する最少数も常に十進表示しておくとかかな 浮動小数は仮数部*指数部で表現されるから最小単位が指数部に依存する
つまり数値に合わせてεも決めなきゃいけないってことでFA? ■ このスレッドは過去ログ倉庫に格納されています