Я хотел бы знать, как можно представить бесконечность, если для этого нет встроенной функции.
Я знаю, что если мы будем использовать float
или double
, мы сможем использовать infinity()
с #include <limits>
. Но если мне нужно использовать int
или в случае NTL, ZZ
, как я должен представлять бесконечность? Должен ли я написать что-то новое? Как это представлено в C++?
Edit: Я задаю этот вопрос, потому что я хотел бы реализовать алгоритм сложения для точки на эллиптической кривой. Итак, мне нужно бесконечность, чтобы представить точку бесконечности. Мне было интересно, буду ли я лучше использовать проективные координаты и [0: 1: 0] представлять бесконечную точку, но сначала хотел исследовать бесконечность в int
или ZZ
.
Как насчет только символического представления, чтобы оно "действовало", в общем смысле, как бесконечность?
Конечно, вы можете сделать что-то подобное. Для большинства вычислительных проблем, которые обычно не будут полезными вам. Простым способом подхода является создание ваших собственных типов данных и переопределение всех операторов для надлежащей обработки бесконечности. Не все бесконечности одинаковы, поэтому вам нужно будет справиться с этой проблемой. Например, вы можете определить настроенное значение 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;
};
ПРИМЕЧАНИЕ. Вам нужно будет много подумать о том, как относиться как к нулям, так и к бесконечности. Вышеприведенный код не очень продумано, но я надеюсь, что это даст вам о чем подумать.
В общем, если вы работаете на бесконечности на машине с конечной точностью, вы не решаете проблему правильно с помощью своего вычислительного подхода. Вы должны либо аналитически справляться с бесконечностью перед рукой, либо найти средство для надлежащего исключения ее с конечной точностью. Например, если вам нужно иметь дело с f (x) = sin (x)/x, вы, вероятно, не захотите, чтобы ваш код оценивал это с конечной точностью при x = 0. Вместо этого вы хотели бы проверить, является ли x равным 0 а затем верните f (0) = 1,0.