C ++ NTL(作者Victor Shoup):如何表示无穷大

时间:2013-10-11 01:04:06

标签: c++ infinity ntl

我想知道,如果没有内置功能,你将如何表示无穷大 我知道如果我们使用floatdouble,我们就可以将infinity()#include <limits>一起使用。但是如果我需要使用int或者在NTL ZZ的情况下,我该如何表示无穷大?我应该写一些新东西吗?它是如何用C ++表示的?

编辑:我提出这个问题,因为我想在椭圆曲线上实现点的加法算法。所以,我需要无穷大来代表无穷远点。我想知道我是否会更好地使用投影坐标并使用[0:1:0]来表示无穷远处的点,但是想先在intZZ选项中探索无穷大。

2 个答案:

答案 0 :(得分:1)

一般情况下,如果您在有限精度机器上遇到无穷大,那么您无法使用计算方法正确解决问题。您应该预先分析处理无穷大,或者找到一种以有限精度适当避免它的方法。例如,如果您必须处理f(x)= sin(x)/ x,您可能不希望让代码在x = 0时以有限精度对此进行评估。相反,您需要检查x是否为0然后返回f(0)= 1.0。

答案 1 :(得分:1)

在一般意义上,它只是一种象征性的表现形式,它会像无限一样“行动”吗?

你当然可以这样做。对于大多数计算问题,不会让你有用。一种简单的方法是创建自己的数据类型并覆盖所有运算符以适当地处理无穷大。并非所有的无穷大都是相同的,所以你需要处理这个问题。例如,您可以将自定义浮点数定义为类似

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;
};

注意:您需要考虑如何处理零和无穷大。上面的代码没有经过深思熟虑,但我希望它能给你一些思考。