【问题标题】:C++ NTL (by Victor Shoup): How to represent infinityC++ NTL(作者 Victor Shoup):如何表示无穷大
【发布时间】:2013-10-12 04:18:42
【问题描述】:

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

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

【问题讨论】:

  • 你需要如何使用无穷大作为int?在什么情况下?
  • 没有约定来表示整数的无穷大;意思是,您可以对整数进行的算术运算对处理或生成无限值一无所知。发生这种情况是因为在处理整数时几乎没有人使用无穷大。也许你应该告诉我们你为什么认为你需要无穷大。
  • 嗨@nhgrif,@DanielKO,我会在问题中添加为什么我需要无穷大。

标签: c++ infinity ntl


【解决方案1】:

一般来说,如果您在有限精度的机器上遇到无穷大问题,那么您的计算方法就没有正确解决手头的问题。您应该事先分析处理无穷大,或者找到一种方法以有限的精度适当地避免它。例如,如果您必须处理 f(x)=sin(x)/x,您可能不想让您的代码在 x = 0 处以有限精度评估它。相反,您需要检查 x 是否为 0然后返回 f(0) = 1.0。

【讨论】:

  • 如果只是一个象征性的表示,让它在一般意义上“行动”,就像无穷大一样?
【解决方案2】:

如果只是一个符号表示,它在一般意义上“行动”,就像无穷大一样?

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

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

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

【讨论】:

    猜你喜欢
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2016-04-30
    • 1970-01-01
    • 2019-03-19
    • 2021-05-08
    相关资源
    最近更新 更多