C ++ NTL (by Victor Shoup): как изобразить бесконечность

0

Я хотел бы знать, как можно представить бесконечность, если для этого нет встроенной функции.
Я знаю, что если мы будем использовать float или double, мы сможем использовать infinity() с #include <limits>. Но если мне нужно использовать int или в случае NTL, ZZ, как я должен представлять бесконечность? Должен ли я написать что-то новое? Как это представлено в C++?

Edit: Я задаю этот вопрос, потому что я хотел бы реализовать алгоритм сложения для точки на эллиптической кривой. Итак, мне нужно бесконечность, чтобы представить точку бесконечности. Мне было интересно, буду ли я лучше использовать проективные координаты и [0: 1: 0] представлять бесконечную точку, но сначала хотел исследовать бесконечность в int или ZZ.

Теги:
infinity
ntl

2 ответа

1

Как насчет только символического представления, чтобы оно "действовало", в общем смысле, как бесконечность?

Конечно, вы можете сделать что-то подобное. Для большинства вычислительных проблем, которые обычно не будут полезными вам. Простым способом подхода является создание ваших собственных типов данных и переопределение всех операторов для надлежащей обработки бесконечности. Не все бесконечности одинаковы, поэтому вам нужно будет справиться с этой проблемой. Например, вы можете определить настроенное значение float как нечто вроде

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

ПРИМЕЧАНИЕ. Вам нужно будет много подумать о том, как относиться как к нулям, так и к бесконечности. Вышеприведенный код не очень продумано, но я надеюсь, что это даст вам о чем подумать.

1

В общем, если вы работаете на бесконечности на машине с конечной точностью, вы не решаете проблему правильно с помощью своего вычислительного подхода. Вы должны либо аналитически справляться с бесконечностью перед рукой, либо найти средство для надлежащего исключения ее с конечной точностью. Например, если вам нужно иметь дело с f (x) = sin (x)/x, вы, вероятно, не захотите, чтобы ваш код оценивал это с конечной точностью при x = 0. Вместо этого вы хотели бы проверить, является ли x равным 0 а затем верните f (0) = 1,0.

  • 0
    Как насчет просто символического представления, такого, что оно «действует», в общем смысле, как бесконечность?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню