Я хотел бы знать, как можно представить бесконечность, если для вас нет встроенной функции.
Я знаю, что если мы используем 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;
};
ПРИМЕЧАНИЕ. Вам нужно будет подумать о том, как обращаться с нулями и бесконечностями. Приведенный выше код не очень хорошо продуман, но я надеюсь, что он даст вам возможность подумать.