我写的是C++
我希望对一些向量按其方向排序。我用下面的struct存向量
struct V { double x, y };
写下面的比较函数
inline bool operator<(const V &a, const V &b)
{
return atan2(a.y,a.x)<atan2(b.y,b.x);
}
我把它传进std::sort里,然后排序过程中越界了。具体数据较大,不便分析。
然后我把V改成下面这样,并写一个构造函数
全选复制放进笔记struct V
{
double x, y, t;
V(double _x, double _y) : x(_x), y(_y), t(atan2(y,x)) {}
};
比较函数改成
inline bool operator<(const V &a, const V &b)
{
return a.t<b.t;
}
这样就没问题了。
我原来认为atan2就算计算有误差,传相同的参数进去也应该返回相同的值。上面的情况意味着不是这样吗?还是有别的什么问题?
应该是和下面一样的问题,加了-ffloat-store就好了。用-O0也不会错。
http://stackoverflow.com/questions/7517588/different-floating-point-result-with-optimization-enabled-compiler-bug
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。