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

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

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

0

Решение

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

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

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

1

По вопросам рекламы [email protected]