Как преобразовать вещественное число в рациональное?

программирование математика C++ информатика алгоритмы

Такая вот проблема. Это кусок задачи. Остальное я сделал, а это не выходит. Пишу на С++. Код ниже.

struct Rational
{
int Nom, Denom;
};

Rational R2Q(float R)
{
Rational Out;

Out.Nom = R*1000;
Out.Denom = 1000;

Out = RRed(Out);

return Out;
}

Это, в общем, всякая лажа с натуральными дробями. Функция RRed сокращает дробь.

Тестирую 2/3. По идее дробь получается 0,6(6). Ввожу R = 0.6667. А на выходе имеем 333/500.

У кого будут идеи?

P.S. На C++ это у меня 5 программа, до этого только на Pascal/Delphi писал, так что просьба не ругаться. :-)
P.P.S. Если код целиком нужен, то напишу.

Примечание:
Вводил и 0,6666666666666 и 2./3. Результат тот же.

Примечание:
zexo, спасибо огромное. Цепные дроби как раз то, что было нужно. :-)
Ответы:
Наверное потому что 0.6667 и 0.666666666666.... это разные штуки. Если хочешь с периодическими дробями работать - обрабатывай скобочки.
Нужно использовать непрерывные дроби:
без  goto s нельзя, нужен безусловный выход, хотя это не поощряется.
на лишние индификаторы не обращай внимание. это кусок из программы
Хочу уточнить вопрос. Что понимается под преобразованием вещественного числа в рациональное ? Просто либо я что-то недопонял, либо вы неточно понимаете что есть рациональные и вещественные числа. Или, если можно, просто сформулируйте по-другому вопрос.
на мой взгляд использование цепных дробей оправданнее перебора. таким образом получается не первое попавшееся приближение, а именно "подходящая дробь" (смотрите в википедии определение) -- это дробь, оптимальная в некотором смысле.


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.