- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经意识到,为了快速排序,所有无穷大都必须相等。
换句话说,这样的标准是不够的:
class Entity
{
public:
float value() const;
bool valueIsInfinite() const;
};
class Criterium
{
bool operator()(Entity left, Entity right)const
{
if (left.valueIsInfinite())
return false;
return left.value() < right.value();
}
}
const Criterium criterium;
QVector<Entity> container;
qSort<container.begin(), container .end(), criterium>
此排序失败,因为根据标准并非所有无穷大都相等。不等式取决于实体进入运算符的顺序。我发现,这样的排序失败了。
我需要这样的东西:
class Criterium
{
bool operator()(Entity left, Entity right)const
{
if (left.valueIsInfinite() && right.valueIsInfinite())
return false;
if (left.valueIsInfinite() && !right.valueIsInfinite())
return false;
if (!left.valueIsInfinite() && right.valueIsInfinite())
return true;
return left.value() < right.value();
}
}
但是假设不是
float Entity::value() const;
bool Entity::valueIsInfinite() const;
方法,我只想用
float Entity::value() const;
让它返回
std::numeric_limits<float>::infinity();
在某些情况下
bool Entity::valueIsInfinite() const;
会返回真值。
现在我测试了这种方法,它似乎有效。但我担心无限可能出现的其他方式。例如:
float otherInfinity = exp(std::numeric_limits<float>::infinity());
这个无穷大好像是一样的。但我想确定。我知道 C++ 标准没有提到浮点运算实现的细节,但是如果我使用 gcc,它在所有情况下都是安全的吗?我的意思是在 gcc 中所有的无穷大都是平等的吗?对可能包含在不同场合出现的无穷大的浮点容器进行排序是否安全?
最佳答案
在没有 NaN 的情况下,无穷大可以使用常规运算符 <
:
<
是反身的;<
是反对称的;<
具有传递性;<
显示等价的传递性。(类似的性质对-∞有效)
鉴于这些属性 operator<
在没有 NaN 的 float 上 是严格的弱排序,因此适用于标准库样式的排序操作。
但是,对于 NaN,反对称性被打破:NaN < 1 为假,1 < NaN 也为假。您可以通过在所有非 NaN 之前或之后对所有 NaN 进行排序来解决此问题,其方式类似于您提议的策略:
struct Criterion
{
bool operator()(Entity left, Entity right)const
{
// NaNs come before non-NaNs
if (isnan(left.value()) && isnan(right.value()))
return false;
if (!isnan(left.value()) && isnan(right.value()))
return false;
if (isnan(left.value()) && !isnan(right.value()))
return true;
return left.value() < right.value();
}
}
( isnan
可以在 C++11 标准库中找到,或者很容易实现为 return x != x;
)
有了这个,我们得到 NaN < 1 为真,1 < NaN 为假,而其他属性仍然成立。
关于c++ - 使用快速排序对可能包含无穷大的容器进行排序是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11641605/
任何数字减去它本身应该是 0,对吗? 3 - 3 === 0 那为什么 Infinity - Infinity === NaN 因为 typeof Infinity 是 'number': 最佳答案
我有一个可能为零的数字。我除以那个数字所以我想测试它是否为零以防止 NaN 和无穷大。由于除法中的舍入误差,我是否仍可能创建 NaN/无穷大? double x; // might be zero d
我使用carrierwave 和mini_magick 上传图片。在开发中一切都很好,但在生产中它引发了 FloatDomainError (Infinity)当我尝试上传图片时。我在同一台服务器上托
我有一个递归函数,它从一组边生成路径列表。但是,有时由于图形的性质,它会进入循环并生成一个字典,其中在列表中包含无限循环符号 [...],例如: {('a', 'b'): [[1, 2, 8, 9,
我正在摆弄 JavaScript 中的按位运算符,我发现有一件事值得注意。 bitwise or operator返回1如果两个输入位之一是 1 作为输出位。这样做x | 0总是返回x ,因为| 0没
我检查二叉树是否是 BST 的解决方案如下: def is_BST(node): if node is None: return False stack = [(node, -floa
给定(Python3): >>> float('inf') == Decimal('inf') True >>> float('-inf') >> float('-inf') >> Decimal('
我正在尝试使用 scikit learn 拟合一个简单的机器学习模型。在这条线上: clf.fit(features, labels) 我得到一个熟悉的错误: Input contains NaN,
我有一个数据集,它是 2 个浮点类型数字的比率。有些值具有 inf 表示无穷大(除以零)的情况。如何使用 pd.qcut/pd.cut 和 inf 值? 我的数据可以访问 here . q = pd.
好的,我知道之前有人用一个有限的缩放示例问过这个问题 [-1, 1]间隔 [a, b] Different intervals for Gauss-Legendre quadrature in num
案例:我们有一个运行 bash 脚本的 docker 容器,该脚本需要永远“阻塞”(因为它为另一个容器公开了一个卷,但有时我们需要这样做还有其他原因)。 我当时认为这可以工作: exec sleep
我是一名优秀的程序员,十分优秀!