- C++相談室 part145
366 :デフォルトの名無しさん[sage]:2019/10/05(土) 12:34:57.85 ID:dFaPF8AB - >>365
x-yの元になっているxやyがどのような計算過程を経てきたかわからないのに std::abs(x-y) <= std::numeric_limits<T>::epsilon() * std::abs(x+y) * ulp でxとyがalmost equalsと言い切ってよい根拠とは、 ちゅか常識的に考えて、x、yがそれぞれ±e、±gの誤差を有するなら std::abs(x-y) <= std::numeric_limits<T>::epsilon() * (std::abs(e) + std::abs(g)) あたりの判定に落ち着かねばおかしい(これで正解とは言っていない なんでstd::abs(x+y)みたいな場合によっては莫大な値になりえる係数を掛けねばならないの?
|
- C++相談室 part145
369 :デフォルトの名無しさん[sage]:2019/10/05(土) 13:28:00.03 ID:dFaPF8AB - >>367
>イプシロンに誤差を掛けても意味ない。 >つか、許容誤差の絶対値が与えられているならイプシロン使う必要もない。 左様ですなスマンカッタorz >>368 >なにこれ?「誤差」って何に対する何の誤差? 真の値に対する誤差じゃわパオーン 真の値に対する誤差に依存しないalmost equal判定とか、使いどころはきわめて限定されるはず、
|
- C++相談室 part145
370 :デフォルトの名無しさん[sage]:2019/10/05(土) 14:05:34.77 ID:dFaPF8AB - >abs(x+y)はxとyの指数のうち大きい方を意味するものだったはず。
xが (xの符号)×1.bbbb...×2^m yが (yの符号)×1.cccc...×2^n だとしたときに、m>nだとすると x + y = { (xの符号)×1.bbbb... + ((yの符号)×1.cccc...×2^-(m-n)) } ×2^m として計算されるのでだいたい2^m(x≒yなら2^(m+1))という意味か左様か、
|
- C++相談室 part145
371 :デフォルトの名無しさん[sage]:2019/10/05(土) 14:08:05.45 ID:dFaPF8AB - んまーulpをxとyの来歴に応じて調整すべき量とするなら
cppreference.comのalmost_equal関数は理解してやらないでもない
|