DxLibEx icon indicating copy to clipboard operation
DxLibEx copied to clipboard

safe_dist関数をrenameしてabs_diffに

Open yumetodo opened this issue 9 years ago • 8 comments

現在 https://github.com/Nagarei/DxLibEx/blob/a02079141b420889e40a9455f7e8edae28ab7a82/dxlibex/algorithm/safe_dist.hpp にsafe_dist関数があるが、これを [PDF] N4318: Proposal to add an absolute difference function to the C++ Standard Library に合わせた仕様のものにする

提案文章では

template <typename T>
decltype(auto) std::abs_diff( const T& a, const T& b )
{
    if (a<b) return b-a; return a-b;
}
template <typename T, typename Compare>
decltype(auto) std::abs_diff( const T& a, const T& b, const Compare& comp )
{
    if (comp(a,b)) return b-a; return a-b;
}
template <typename T, typename Compare, typename Difference>
decltype(auto) std::abs_diff( const T& a, const T& b, const Compare& comp, const Difference& diff )
{
    if (comp(a,b)) return diff(b,a); return diff(a,b);
}

となっているが、decltype(auto)はVS2013では動かない&constexprになっていないので、まあ頑張るしかないだろう。

yumetodo avatar Sep 24 '16 10:09 yumetodo

safe_distを完全に削除しても良いと思います。 まだユーザーがほとんどいないので破壊的変更も許されるかと思います。

Nagarei avatar Dec 15 '16 06:12 Nagarei

スレッド生成とかで100%安全に差の絶対値を計算する需要もあると思うので、とりあえずdeprecatedにしてあとで、

C/C++はnull安全になる前に安全に差の絶対値を計算できるようになるべきではないか#つまり安全に差の絶対値を計算できるようにはどうすればいいのか

を持ってこようかと思っています。 Coqをもちいて、C/C++の整数演算が安全な条件を求め証明していくという~~頭のおかしい~~素晴らしい試みをしている記事の著者がコメント欄で

(本当は; 私から見ると) ツッコミ入れたい部分が二三箇所あるのですが

といっていて、怖いのでまだこちらに入れるつもりはありませんが。

yumetodo avatar Dec 15 '16 11:12 yumetodo

ごめんなさい。 abs_diffと(将来の)safe_distの違いを説明していただけますか?

Nagarei avatar Dec 15 '16 12:12 Nagarei

まず、非負整数を保証できる場合はabs_diffで十分です。 で、現状のabs_diffの利用ケースはdistanceの導出ですが、これは明らかに非負整数を保証できないケースだったりします。なのでsafe_distを本音では使いたいです。

ただ、safe_distの場合強制的にunsignedに持っていくのが望ましい挙動かという問題と、浮動小数点数のときどうしよう、という話があり、またまだバグっている疑いがあるため、まだ持ってこれないので、とりあえず今はN4318のabs_diffを呼ぶようにしておけばコーナーケースをつかなければUndefined Behaviorにならないのでまあいいかなと思っています。

実際問題、[INT_MIN, INT_MIN]と[INT_MAX,INT_MAX]の距離を求めるようなユーザーがどれだけいるかという・・・。

じゃあ名前変えないで放置でいいのでは、という話がありますが、UBを防げないのにsafe_distという命名は良くないなと思っているのでN4318に合わせよう、という思いです。


ああ、あとは現状の利用箇所であるdistanceは当たり判定なので使われることを想定しているので、あまり例外を使いたくない(=noexceptにしたい)という話もあります。 つまり、Qiitaのアレを持ってこないで、安全でないケースにassetを貼るだけで対処する、というのもありだと思います。

yumetodo avatar Dec 15 '16 12:12 yumetodo

うーん。

  • abs_diff
    • 一般的なdistanceの導出
    • N4318準拠
    • オーバーフローによる未定義動作の恐れあり
  • safe_dist
    • distanceの導出
    • リンク先の現在の実装
      • unsignedを返すことでオーバーフローを多少防ぐ
      • それでもオーバーフローによる未定義動作の恐れあり
      • そもそも浮動点少数にunsignedはないという問題
    • 将来
      • noexceptにしたい

であってるでしょうか?間違ってたら指摘してください。

Nagarei avatar Dec 15 '16 13:12 Nagarei

それでもオーバーフローによる未定義動作の恐れあり

Qiitaの実装は例外投げてるので(バグっているという指摘を除けば)UBにはならないです

noexceptにしたい

速度か安全かというところ・・・。いっそassertを使うdistanceと例外を投げるsafe_distanceの2つ用意するか・・・。

yumetodo avatar Dec 15 '16 15:12 yumetodo

assertを使うdistanceと例外を投げるsafe_distanceの2つ用意するか・・・。

それで良いような気がします。当たり判定は高速に動作させるのが良いですし。

Nagarei avatar Jan 01 '17 08:01 Nagarei

うーん、その場合assertを使う方はconstexprにできないな・・・。やむを得ないか。

yumetodo avatar Jan 06 '17 14:01 yumetodo