На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Приближённое сокращение дроби.
    У меня возник вопрос, который не могу решить сам.
    Суть такова, есть несократимая дробь (числитель/знаменатель), нужно сделать так, что бы числитель и знаменатель был не более чем заданное число и при этом, итоговое дробное число было как можно ближе к изначальному. На данный момент я целочисленно делю и числитель и знаменатель на 2 до тех пор(сокращая дробь по возможости), пока не будет достигнута нужная разрядность, но подозреваю, что это не самое точное решение. Если есть какие-то уже известные методики, то приветствуется любая информация.
      Насколько данная операция критична по времени?
      Насколько велики исходные значения числителя и знаменателя?
        Цитата KIA @
        У меня возник вопрос, который не могу решить сам.
        Суть такова, есть несократимая дробь (числитель/знаменатель), нужно сделать так, что бы числитель и знаменатель был не более чем заданное число и при этом, итоговое дробное число было как можно ближе к изначальному. На данный момент я целочисленно делю и числитель и знаменатель на 2 до тех пор(сокращая дробь по возможости), пока не будет достигнута нужная разрядность, но подозреваю, что это не самое точное решение. Если есть какие-то уже известные методики, то приветствуется любая информация.


        Не все дроби могут удовлетворять "заданному числу". Ибо может получится дробь 0/число.
        Ну а методу я бы изобрел следующую, на примере ...

        ExpandedWrap disabled
          Пусть дано:
           
          Дробь - 17/33
          "Заданное число" - 3
           
          int(17/3)=5
          int(33/3)=11 <--- выбираем большее (11>5)
           
          int(17/11)       1
          ------------ =  ----
          int(33/11)       3


        Или я не так понял задачу?

        Добавлено
        Цитата JoeUser @
        пока не будет достигнута нужная разрядность

        Если все же "заданное число" - это разрядность, тогда используем для "первого деления" степень основания системы исчисления.
          Воспользуйся аналогом двоичного поиска, только вместо середины отрезка бери медианту.

          Добавлено
          Цитата JoeUser @
          Ну а методу я бы изобрел следующую, на примере ...

          И на твоём же примере это не работает :D К 17/33 ближе 2/3, а не 1/3.
            Цитата JoeUser @
            методу я бы изобрел следующую, на примере ...

            Ну и сбойнула твоя метода - 2/3 ближе к исходнику.
              Разделить числитель и знаменатель на число K (не обязательно целое) и округлить. K подбираем так, чтобы новые числитель и знаменатель удовлетворяли ограничению.

              Цитата
              Дробь - 17/33

              "Заданное число" - 3


              K=11 получим 2(1,5454545454545454545454545454545)/3
              Сообщение отредактировано: Pavlovsky -
                OpenGL, Akina, да - согласен, неувязочка :lol: Точность хромает.
                  Цитата JoeUser @
                  Точность хромает.

                  Да в озвученных тобой условиях правильным ответом вообще является 1/2. То, что в результате значения числителя и знаменателя ограничены заданным значением, не запрещает им быть меньше этого предела.
                    Цитата Pavlovsky @
                    Разделить числитель и знаменатель на число K (не обязательно целое) и округлить. K подбираем так, чтобы новые числитель и знаменатель удовлетворяли ограничению.

                    Это не будет работать если числитель или знаменатель требуемого числа будут строго меньше ограничения. Например, для 2/7 и ограничения 6 ответ 1/4, а твоим алгоритмом - 1/3.

                    Добавлено
                    Цитата Akina @
                    Да в озвученных тобой условиях правильным ответом вообще является 1/2.

                    Ха. А я-то и не заметил этого :D
                      KIA
                      Цепные дроби решают твою задачу оптимальным образом:
                      Цитата
                      подходящая дробь Pn/Qn является наилучшим приближением для x среди всех дробей, знаменатель которых не превосходит Qn;


                      Добавлено
                      P.S. Только тебе надо уйти от начального рационального числа в сторону на небольшую величину, чтобы получить вещественное число, которое будешь приближать. То есть вместо m/n надо приближать m/n + eps, где eps подбирать экспериментально. Иначе цепная дробь быстро выродится, если число рациональное.
                        Цитата OpenGL @
                        Например, для 2/7 и ограничения 6 ответ 1/4, а твоим алгоритмом - 1/3.


                        1/3 (отклонение 1/21) на совсем чуть-чуть хуже чем 1/4 (отклонение 1/28).
                          Цитата Pavlovsky @
                          1/3 (отклонение 1/21) на совсем чуть-чуть хуже чем 1/4 (отклонение 1/28).

                          Это "чуть-чуть" можно довести до большой величины. Собственно, пример JoeUser это как раз иллюстрирует.
                            А где у нас топикстартер? или ему уже всё по барабану?
                              Цитата OpenGL @
                              Это "чуть-чуть" можно довести до большой величины.


                              Чем больше значение ограничения, чуть-чуть превратится совсем в мизерные значения.
                                Народ, а как вам такое:

                                user posted image

                                Если я ниче не напутал с арифметикой, то останется только умножить числитель и знаменатель на нужную степень десятки, и отсечь дробную часть. Точность конечно теряется, но на пятом знаке после запятой. Че скажите, или опять шило? :-?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0429 ]   [ 15 queries used ]   [ Generated: 17.11.25, 07:36 GMT ]