【プログラミング】浮動小数点の比較方法について教えてくれ
■ このスレッドは過去ログ倉庫に格納されています
0001以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:28:19.915ID:/eAvuREKd
イプシロン?ってやつは調べた
0002以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:29:15.517ID:kFqLSmAH0
じゃあそれで
0003以下、無断転載禁止でVIPがお送りします
垢版 |
2022/02/26(土) 17:29:58.808ID:/BjyNypad
decimalにする
0004以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:30:11.833ID:xC+THJlQ0
(´へεへ`*)
0005以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:30:12.713ID:gXROPdnM0
パンシロンのほうが便利
0006以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:31:42.892ID:ONRXpyhVM
まずテストケースここに書けよ
0007以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:31:42.944ID:/zBX/SIG0
floatで比較しろ
0008以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:33:32.813ID:/eAvuREKd
>>6
入力値が最大値を越えてないかチェックする感じ
999.9までみたいな

そのとき浮動小数点の比較ってどうなんって話になった
0009以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:33:53.104ID:/eAvuREKd
会社で勉強しろって言われたけどよぅわからん
0010以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:34:21.852ID:7iT+xY7Ga
有効桁は決まってるの?
0012以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:35:28.497ID:/eAvuREKd
浮動小数点の値は仮数×2の何乗かでしか表せないから
0.1とか0.2は割り切れない値になるのはわかる
0013以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:35:48.042ID:/eAvuREKd
>>10
表示上は1桁まで
0014以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:37:34.001ID:/eAvuREKd
イプシロンって要は
1×2のマイナス(指数部分のビットの最大値)乗なんでしょ

つまりプログラミングの浮動小数点で表せる値=イプシロンの倍数ってこと?

これ違う?
0015以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:39:27.380ID:Anf1PKRq0
ふつうに<で比較すりゃいいんじゃないの?
それとも内部でどういうふうに処理されるかって話?
0017以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:40:27.687ID:/eAvuREKd
これって要は変数の持ってるビット数によってイプシロンの値が変わるってだけでしょ?
指数のビット数が多いだけ細かく刻める的な
https://i.imgur.com/ytWYyBK.jpg
0018以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:41:29.538ID:HuORsVjCM
>>8
テストコード書けよ

validate(1000) == true
validate(999.9) == false

を満たすvalidate関数を作りたいってこと?
0019以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:41:44.603ID:/eAvuREKd
>>15
それは良くないんだ
誤差があるからそこを考慮しないといけない
その計算式のテンプレートはあるけどただコピペするんじゃなくて中身を理解しろと言われた
0021以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:43:46.120ID:/eAvuREKd
>>18
トゥルーフォルスは逆だけどね
999.9までで999.91はアウトみたいな感じにしたいと思った
まあ実際の処理で浮動小数点の比較やるのやめたけどこの勉強自体はしとけと


CしかわからんからCっぽく書いてくれると嬉しい
0022以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:44:48.388ID:/eAvuREKd
>>20
それ使う必要ある?
探してくれたのは嬉しいけどあんま関係ないような
0025以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:48:13.631ID:/eAvuREKd
>>23
???
ビット数で表せる値の範囲の話?
0026以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:48:47.152ID:HuORsVjCM
なるほど999.9 >= x って書くとだめなんだろうな
0027以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:49:55.382ID:/eAvuREKd
>>26
そうなんよ
=出来んからね
0029以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:52:25.060ID:HuORsVjCM
C専門じゃないけど
999.9 + epsilon => x ってやるのかな
それかイプシロン以上で十分小さい数を足して比較する
0030以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:52:38.218ID:I+O50/Pu0
そもそも小数が1/2のべき級数の和で表現されるっていう基本を理解できてんのか?
0031以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:52:59.185ID:/eAvuREKd
>>28
そら出来るけど…
>>12ここでゆーてるし

精度の話って今回関係あるのかなあ?
フロートでもダブルでもイプシロンはそれぞれあるし
使う変数が変わることで計算方法に変化はしないでしょ?
0032以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:54:00.314ID:/eAvuREKd
>>29
多分それじゃダメっぽいね
>>14こう考えたけど仮数部分の桁数も有限だから倍数全ては扱えんな
0034以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:55:18.008ID:GxuIad0zr
まずどんな目的で小数点の比較をやりたいんだ
実装なんてユースケースによるだろ
精度低めでいいなら比較する数同士をN倍して小数点切り捨てて比較が一番楽
とはいえ浮動小数点数同士の比較はハードウェアによって演算結果が変わるから基本的にはこの手法だと思う
0035以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:55:33.189ID:/eAvuREKd
>>30
小数って言うと誤解招くでしょ
計算機小数点数でしょ

人間が書く小数なら全然ちゃうわ
0036以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:56:45.672ID:/eAvuREKd
>>33
あのさあ…
まあ今回は有効桁数ってのがあるからいいけど、そこが決まってない値だと困るよね
999.99999999999999999999999をどうやって判定するか
0037以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:56:58.148ID:I+O50/Pu0
>>35
おっしゃる通りだけど、このスレの文脈でそれ以外ありえねえのに面倒な揚げ足取りしてくるタイプとは思わんかったわ
0038以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:57:44.383ID:/eAvuREKd
>>34
精度高くても小数の比較を扱えるようにしたい
なんかテンプレの計算式ってのがあるんでしょ?
あれ説明できるくらいになりたい
0039以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 17:58:40.232ID:/eAvuREKd
>>37
流石に小数ってってのは誤解を招くよ
プログラミングでのとかフロートダブル型はって言わんとね
0040以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:00:51.856ID:RokG7yuS0
不動小数点なんでしょ?任意精度じゃなくて
何がしたいのか分からん
0041以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:01:03.641ID:/eAvuREKd
人に説明できるくらい勉強して来いが課題だから非常に面倒
0042以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:01:40.138ID:/eAvuREKd
>>40
>>41←これ
0043以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:01:41.825ID:F9SUkTrjd
一致不一致だけなら文字列にしたらいいのでは
0044以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:03:09.600ID:/eAvuREKd
>>43
浮動小数点の比較から逃げるな
0045以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:03:50.332ID:F9SUkTrjd
>>44
勉強から逃げてる奴がイキんな!
0046以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:06:16.404ID:/eAvuREKd
>>45
人に聞くことも勉強でしょうが…
休日なのにやらんでもいいんだけど仕事中に調べてもようわからんから休みの今聞いてるの


偉いじゃん?
0047以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:06:17.727ID:qJZfKSCZ0
ITパスポート持ちの俺が教えてあげる
符号部、指数部、仮数部のbitで比較すればOK!
0048以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:06:43.448ID:F9SUkTrjd
とりあえず与えられてる数値が上に下に何桁あろうが
それを10桁ぐらい切り取ってintにして比較したらいうじゃん
1億桁あるなら1000万回比較するだけだぞ?
0049以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:08:30.517ID:S20PjT2q0
>>31
四則演算ならフル精度で求まる
関数の制度は環境による
FMAで乗算と加算が同時じゃないと問題になる演算系もあるらしい
2値を引いた結果やゼロ除算チェックでイプシロンを有効範囲にしたりする
0050以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:08:36.618ID:/eAvuREKd
>>47
基本情報持ちだが震えてる
もっと詳しく
0051以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:10:33.498ID:/eAvuREKd
>>49
そうなってるんだ
そこら辺理由もつけて説明してくれるとありがたい
0052以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:22:25.780ID:S20PjT2q0
>>51
関数ってのは級数展開で出来るだけ多く求めると精度が出る
浮動小数点ユニットが生まれてからの歴史でも数学の発展で劇的に処理が高速化されている
たとえばsqrtは逆数のRecipSqrtの方が単純な計算になる、逆数はテーブル処理、単精度であれば2回処理して逆数で求まる
4回計算すれば倍精度、高速化して半精度で良いなら一回の計算といった内部処理
0053以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:29:45.834ID:q5VfK3VW0
イプシロンとか有効桁数とかめちゃくちゃ単純な話をさも難しいかのように表現してるレスには同意して簡単に説明してるレスには反発してるだけじゃん
0055以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:44:06.266ID:wFEHDup20
10倍して符号付き整数にキャストして9999と比較じゃダメなのか?
0056以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:45:03.691ID:/eAvuREKd
出かけてた
0057以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:46:24.727ID:/eAvuREKd
>>52
難しい単語使わないでもっと分かりやすく説明して(^-^;💦
0058以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:46:40.705ID:/eAvuREKd
>>53
簡単な話なら説明よろ
0059以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:46:55.976ID:/eAvuREKd
>>55
ダメ
浮動小数点の比較をやれと言われてる
0060以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:48:51.247ID:/eAvuREKd
例えば
double x=0.1;
double y=0.2;
y/=2;

こう計算するとx=yにならんのでしょ?
そこら辺が面倒
0062以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:53:58.607ID:/eAvuREKd
>>61
日本語じゃないじゃん…
簡単な用語で説明するくらい詳しくないん…?
0063以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:55:32.194ID:mIPzLsuN0
入力の有効桁数が何桁なのかによる気が
0064以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:56:42.336ID:I+O50/Pu0
そもそも比較をやれってリクエストがいまいちピンとこないんだけど、マシンイプシロンを測定するコードを書いて説明しろって意図?
0065以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 18:59:14.180ID:/eAvuREKd
>>64
例えば>>60みたいな計算があったとして誤差の範囲を求めてx==yの判定がトゥルーになるようにコード組んで説明しろってことかなあ

ぶっちゃけ
>>41だからなあ
0066以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 19:05:41.228ID:I+O50/Pu0
>>65
それで言うと実務では必要な精度が要件として定義されているはずなので、差の絶対値がそれ以下ならtrueってやるのが普通だよね
数値計算やってる人であれば、誤差の範囲を求めて限界まで〜ってのも分かるけど……
業種は何なの?
0067以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 19:05:51.423ID:wFEHDup20
>>59
状況概ね把握した
出題者に「何が知りたいのかはっきりさせろ」って回答しておけ
0068以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 19:08:20.228ID:DC45ucojM
(0.1)^nで比較するのも
10^n倍して計算するのも同じこと

fewEqual = (a, b) => abs(a - b) <= X

比較対象を求める演算の過程で起こりうる誤差の値をxにするか
毎回しっかり丸め込めばいいんじゃないの
0069以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 19:09:22.097ID:S20PjT2q0
最初に戻るけど人に説明するなら2進の仮数と指数にして手計算
手計算面倒なので変換器で出た内容を可視化するだけで良い
プログラムの実コードなら共用体とビットフィールドで変換器を自前実装してれば納得してもらえる
0070以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 19:13:24.328ID:I+O50/Pu0
俺も>>69だと思うけどな
ただ、計算を繰り返したときに誤差の蓄積が発生するようなケースをいかに回避するか?みたいな話には踏み込めてないけど別に良いのかな
あと、何かの関数の値を求めるときに級数展開が利用されていて、その切り捨てに伴う誤差の話題にも触れられないよな
0073以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 19:28:28.895ID:HfGbVrNL0
浮動小数点使わないようにできないの?
0074以下、5ちゃんねるからVIPがお送りします
垢版 |
2022/02/26(土) 19:38:28.677ID:NroPEuhK0
浮動小数は仮数部*指数部で表現されるから最小単位が指数部に依存する
つまり数値に合わせてεも決めなきゃいけないってことでFA?
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況