我想知道如果没有内置函数供您表示无穷大。
我知道如果我们使用 float
或 double
,我们将能够将infinity()
与#include <limits>
一起使用。但是如果我需要使用int
或者在NTL的情况下,ZZ
,我应该如何表示无穷大?我应该写一些新的东西吗?它在C++中是如何表示的?
编辑:我提出这个问题是因为我想为椭圆曲线上的点实现一种加法算法。所以,我需要无穷大来表示无穷大点。我想知道我使用射影坐标并让 [0:1:0] 表示无穷远处的点是否会更好,但想先探索无穷大int
或ZZ
选项。
一般来说,如果你在有限精度的机器上遇到无穷大,那么你就没有用你的计算方法正确解决手头的问题。 你应该事先分析处理无穷大,或者找到一种方法在有限的精度下适当地避免它。 例如,如果你必须处理 f(x(=sin(x(/x,你可能不想让你的代码在 x = 0 时以有限的精度计算它。 相反,您需要检查 x 是否为 0,然后返回 f(0( = 1.0。
那么,仅仅一个符号表示,让它在一般意义上像无穷大一样"行动"呢?
你当然可以做这样的事情。 对于大多数计算问题,不会让你得到任何有用的地方。 一种简单的方法是创建自己的数据类型并覆盖所有运算符以适当地处理无穷大。 并非所有的无穷大都是一样的,所以你需要处理这个问题。 例如,您可以将自定义浮点数定义为类似
class MyFloat
{
public:
MyFloat(float a):
m_val(a),
m_isInf(false),
m_orderInf(0)
{}
bool isInf(){return m_isInf;}
int orderInf(){return m_orderInf;}
float value(){return m_val;}
// define custom operators
MyFloat & operator+= (MyFloat const & rhs)
{
if(rhs.isInf() || m_isInf)
{
m_orderInf = m_orderInf > rhs.orderInf() ? m_orderInf : rhs.orderInf();
m_isInf = true;
}
else
{
m_val += rhs.value();
}
return *this;
}
// other operators you would need to define
MyFloat & operator/= (MyFloat const & rhs);
MyFloat & operator*= (MyFloat const & rhs);
private:
float m_val;
bool m_isInf;
int m_orderInf;
};
注意:您需要仔细考虑如何处理零和无穷大。 上面的代码没有经过深思熟虑,但我希望它能给你一些思考。