Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

safe_dist関数をrenameしてabs_diffに #91

Open
yumetodo opened this issue Sep 24, 2016 · 8 comments
Open

safe_dist関数をrenameしてabs_diffに #91

yumetodo opened this issue Sep 24, 2016 · 8 comments

Comments

@yumetodo
Copy link
Collaborator

現在
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になっていないので、まあ頑張るしかないだろう。

@Nagarei
Copy link
Owner

Nagarei commented Dec 15, 2016

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

@yumetodo
Copy link
Collaborator Author

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

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

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

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

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

@Nagarei
Copy link
Owner

Nagarei commented Dec 15, 2016

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

@yumetodo
Copy link
Collaborator Author

yumetodo commented Dec 15, 2016

まず、非負整数を保証できる場合は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を貼るだけで対処する、というのもありだと思います。

@Nagarei
Copy link
Owner

Nagarei commented Dec 15, 2016

うーん。

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

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

@yumetodo
Copy link
Collaborator Author

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

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

noexceptにしたい

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

@Nagarei
Copy link
Owner

Nagarei commented Jan 1, 2017

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

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

@yumetodo
Copy link
Collaborator Author

yumetodo commented Jan 6, 2017

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants