Я внедрил class NaturalNum
для представления натурального числа «бесконечного» размера (до 4 ГБ).Самый точный способ вычисления числителя и знаменателя двойного
Я также внедрил class RationalNum
для представления рационального числа с бесконечной точностью. Он хранит числитель и знаменатель рационального числа, оба из которых являются экземплярами NaturalNum
и полагаются на них при выполнении любой арифметической операции, выданной пользователем.
Единственное место, где точность «отбрасывается в определенной степени», при печати, так как существует предел (предоставленный пользователем) до количества цифр, которые появляются после десятичной (или десятичной) точки.
Мой вопрос касается одного из конструкторов class RationalNum
. А именно, конструктор, который принимает значение double
и вычисляет соответствующий числитель и знаменатель.
Мой код приведен ниже, и я хотел бы знать, если кто-нибудь увидит более точный способ для вычисления их:
RationalNum::RationalNum(double value)
{
if (value == value+1)
throw "Infinite Value";
if (value != value)
throw "Undefined Value";
m_sign = false;
m_numerator = 0;
m_denominator = 1;
if (value < 0)
{
m_sign = true;
value = -value;
}
// Here is the actual computation
while (value > 0)
{
unsigned int floor = (unsigned int)value;
value -= floor;
m_numerator += floor;
value *= 2;
m_numerator *= 2;
m_denominator *= 2;
}
NaturalNum gcd = GCD(m_numerator,m_denominator);
m_numerator /= gcd;
m_denominator /= gcd;
}
Примечание: переменные, начинающиеся с «m_» являются переменными членами.
Благодаря
Разложите поплавок на знак, мантисса и экспонента, а затем у вас достаточно информации, чтобы точно представлять его. –
Разве я не буду рисковать возможностью различных представлений FP на разных компиляторах (или архитектурах процессоров)? –
@barakmanos Вы программируете для мейнфрейма IBM или суперкомпьютера Cray? Если вы этого не сделаете, тогда забудьте о представлениях, отличных от IEEE 754. –