1. Sometimes in calculations of long sums or series it is worth to know an error caused by cancellations. It is even more useful when there is no opportunity to compute relative error with more precise number.

    The problem of cancellation errors is well-known in numerical theory. Cancellations occur when dealing with subtraction of two close numbers. For example, see wikipedia demonstration for this.

    But there is another case of cancellation when dealing with sum where some partial sum is several exponents more than the final result. In "Essentials of numerical analysis with pocket calculator demonstrations" Peter Henrici calls such type of cancellation "smearing". So let's deal with it.

    P. Henrici gives an approximate formula for lost digits in a series:


    where

    is number of lost digits,
    is max term of sum/series,
      is result of sum/series.

    Let's accelerate evaluation for multiprecision numbers, so we may assume, that


    As long as we use a fixed precision, it is simplified as:

     
    0

    Добавить комментарий

  2. Hi all,

    Problem described in my last post was very awful. It was raised when thinking about algorithm for computation of the following formula(13.3.7 A&S):

    (1)

    Here we can see Bessel functions with increasing order.

    The first thing that came to my mind was evaluation through upward recurrence relation.

    (2)
    But you know it's unstable due to error propagation. Of course we can't evaluate usual Bessel function for any term. In most cases Bessel functions are implemented through series as well. On the whole we may get O(m^2) complexity, where m is a length of floating-point significand.

    We may use stable downward recursion. That way we should estimate an N - initial value for Bessel function where the whole term of (1) shouldn't affect the result of series. That means the term must satisfy the following condition:

    (3)

    where epsilon is discrete of floating point number. This condition just tells that next term doesn't affect the result of partial sum. You may make sure it is quite difficult to estimate this N for different a, b, z parameters.

    Also I tried to use Miller's and Olver's algorithms, but they both require initial unpredicted values.

    Now I would like to suggest some algorithm for computation of (1). It is based on recurrence relation from continued fraction of ratio 


    The idea was taken from an amazing William J. Lentz's article "Generating Bessel functions in Mie scattering calculations using continued fractions". We have the following continued fraction for this ratio:

    (4)

    Let's denote a finite fraction this way:


    and ratio (nth partial convergent):


    Then let's create recurrence relation with explicit form:

    (5)

    where    is (see (4)) :

     

    So I found this recurrence relation as a pretty good solution for my task.

    Let's compare the time-difference between this method and using direct Bessel function evaluation. I use gmp library with significand of 800 digits.

    int main()
    {
      using mp = boost::multiprecision::number<boost::multiprecision::backends::gmp_float<800u> >;
      auto policy = boost::math::policies::policy<>();
    
      mp a = -1;
      mp b = 1.5;
      mp z = 1.42857142857143e1;
    
      std::cout << boost::math::detail::hypergeometric_1f1_13_3_7_series(a, b, z, policy).str() << std::endl;
    
      return 0;
    }
    For direct evaluation we have:

    $ time test
    user    1m20.200s

    And for our recurrence method we have:

    $ time test
    user    0m11.120s

    UPDATE:

    Let's make this algorithm even better. For that, let's denote the following:




    It can be seen that


    So, after that

    The reasonable algorithm is just to use two vectors of []-fractions for numerator and denominator. The last improvement allows to avoid new vector allocation on the next iteration by using previous vector for numerator. So in our implementation we just use two pointers to two vectors for numerator and denominator and swap them on every iteration.

    So let's measure time improvement. For that let's use aforementioned example. My old laptop (from 2006 year) gives a pretty good result:
     
    $ time test
    user    0m7.496s
    0

    Добавить комментарий

  3. Hi all good mathematicians.

    Recently I encountered a problem connected to another well-known problem. Many of you know about woes with recurrence relations. I mean an propagating of round-off errors while computing terms of relation. And everyone of you knows that stability depends on recurrence direction.

    It is a quite strong issue. Let's consider the usual recurrence relation for ordinary Bessel function J(v,x):
     
    We can figure out that absolute error grows catastrophically in this formula. Here is my vimdiff(direct correct result is on the left side and recurrent incorrect result is on the right side):
     
     But which result will we get if we change direction of relation:
      
    Everything is OK! Roundoff errors are minimized! Miller's algorithm is based on it. And it is a food for thought for me.
    0

    Добавить комментарий

  4. It looks like it isn't a good way to declare template
    functions as static. I will try to explain it.

    At least in Linux we have strong and weak symbols
    in object files. You can check out wikipedia for them.
    But if we have only weak symbols, linker will remain
    a sole symbol, hence only one data/function will take
    place in a linked file.

    Compilers mark symbols associated with instantiated
    specializations as weak. If you mark template functions
    as static, compiler won't generate a symbol of its
    specialization in object file's symbol table, hence we will
    have translated code for this specialization in every
    object file. Thereafter linker won't be able to delete
    copies and we will have a bloated linked file.

    Let's check it:

    no static template functions

    common.hpp:
    template <class T> void foo()
    {
      // some long code;
    }
    1.cc
    int main()
    {
        foo<int>();
    }
    2.cc
    void bar()
    {
        foo<int>();
    }

    bash$ stat linked
    Size: 7347


    static template functions

    common.hpp:
    template <class T> static void foo()
    {
      // some long code;
    }
    1.cc
    int main()
    {
        foo<int>();
    }
    2.cc
    void bar()
    {
        foo<int>();
    }

    bash$ stat linked2
    Size: 7363

    I used gcc with no optimisations.
    0

    Добавить комментарий


  5. Yes, I have just read this book!
    I think it is one of the best books on C++ that I have read. It would be perfect for new developers to move from theory to practice. I’m also sure the book will be helpful for more experienced developers. Everyone can find plenty of new helpful recipes in it.
    The book shows the best aspects of an extensive Boost library’s components. By giving problems and their solutions the author reveals the options of Boost sublibraries and tools.
    The book is well-organized, which makes it easy for developers to read. It consists of 12 chapters, each chapter consists of recipes, which divide into following sections “getting ready”,” how to do it”, “how it works”,” there is more”, “see also”. The “getting ready” section lists the required knowledge level, references to other recipes, dependencies, the way the library is supplied: as a separated static/shared module(.a/.so) or just header-only. The “how to do” section contains well-selected examples. It’s noteworthy that “how it works” briefly describes the basic issues of work and implementation details of given tool or feature The title of “there is more” section speaks for itself. The author also highlights the features of C++11. The “see also” section has links to documentations and various aspects of C++/stl. All recipes are relatively irrespective, so you can start reading from any page or use the book as a guide.
    The book covers a variety of practical issues which are not implemented in the standart C++03 library (and also in C++11 library), from metaprograming and compile-time tricks, to working with operating system and networking. Many things such as Boost.Move and Boost.Thread have already been added in C++11. But there are still issues like code portability using Boost for compilers that only support C++03 , or not fully implemented in C++11. Once you read this book, your code will be more secure and portable, and the possibility of memory leaks will be reduced. Many problems that you had to solve manually can now be solved by using Boost. For instance we can look at parsers from Boost.Spirit: you may no longer worry about developing them manually, whether it’s LL-parser or recursive-descent parser. The best part is that there are 95 examples in the book. Moreover, once you’ve learn about various compile-time tricks, you’ll be more confident with reading Boost sources.
    All in all, C++ programming will become easier and more enjoyable.

    0

    Добавить комментарий

  6.     Вспомнил, как 3 месяца назад сидел на работе. Что-то вроде откоммитил и остался без дела. Сейчас бы скорее всего потестил какой-нибудь новый плагин для vim'а. Но тогда решил залезть в багтрекер boost'а.
        Немного поковырявшись, нашел простой баг по поводу ворнингов у MSVS++ 2012.
    Суть: компилятор при виде for (unsigned int i = ...; i > 0; i -= step ) ругается, что цикл бесконечный.
        Скорее всего, Вы догадались, что разработчики анализатора всего лишь на всего "ошиблись на единицу". Цикл прерывается, при i = 0. С другой стороны, в коде тогда должна быть проверка i != 0, тем более что на самом деле цикл выглядит примерно так:
        for (unsigned int i = some_uint*step; i > 0; i -= step )
    Такая проверка, вроде бы, поможет избежать подобных недоразумений, а также слегка оптимизирует задачу.
        Но по поводу оптимизации, кому интересно, все не так просто: оператор > транслируется в инструкции cmp и jg,  в то время как оператор != транслируется в cmp и jne (jg есть jump_if_greater, jne есть jump_if_not_equal). cmp инструкция вычитает операнды и по результату настраивает регистр флагов. команды jxx проверяют нужные флаги и в зависимости от результатов переходят по заданному адресу. Команда jne проверяет один флаг ZF = 0 (ZeroFlag), в то время как jg проверяет целое условие из 3-х флагов: ZF = 0 and SF = OF (SignFlag и OverflowFlag). Логично предположить: jg займет больше тактов. Тем не менее, документация Intel 64 and IA-32 Architectures Optimization Reference Manual не говорит, какая из них имеет большую или меньшую Latency.
        Вообще это дело обычное в boost'е - условная компиляция для дисаблинга ворнингов разных компиляторов. Поэтому приблизительное решение уже нарисовалось в голове. Быстро накалякал его, запатчил совсем чутка препроцессорного кода и забыл.
        Сегодня случайно вспомнил и проверил. Оказалось ментейнер немного изменил его, перенеся код в начало и конец файла, а также убрав проверку версии компилятора.
        Ссылка на тикет.
    3

    Просмотреть комментарии

  7.     Одногруппник прислал C++-код с какой-то ошибкой и вывод компилятора по этому поводу. Но более всего меня удивила не его проблема, а то, что в коде создавался на стеке массив с длиной, не известной на этапе компиляции. Помнится, в начале изучения языка столкнулся с этим и уяснил, что так делать нельзя. Странно, но других ошибок компилятор одногруппника не выдал...
        Где-то читал, что следующий Стандарт C++14, возможно, позволит выполнять такой трюк. Но настоящий говорит, что размер массива должен быть constant expression. Это еще раз уменьшает совместимость с C99, где VLAs давно доступны.
        Я использую GCC 4.8.1, поэтому на нем решил проверить:

    void foo( int n)
    {
        int array[n];
    }

        Компилятор с опцией -pedantic честно выдал:
    warning: ISO C++ forbids variable length array ‘array’.
        На самом деле, VLAs для C++ в gcc являются расширением: http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
        Самое важное, что оператор sizeof считает размер массивов переменной длины в рантайме, а не в компайлтайме. Поэтому, например, мы не сможем инстанцировать шаблон с параметром-нетипом с помощью такого sizeof( vla ):

    template <int p>
    class A
    {
    };
    void foo(int length)
    {
        int const_lenght_array[7];
        int variable_length_array[length];
        A<sizeof(const_lenght_array)> a1; //OK
        A<sizeof(variable_length_array)> a2; //ERROR
    }
    Сообщение компилятора об ошибке славно отвечает, каким образом вычисляется в рантайме размер массива:
    error: ‘(unsigned int)((((sizetype)(((ssizetype)length) + -1)) + 1u) * 4u)’ is not a constant expression
        Также можно использовать указатели на массивы переменной длины и typedef:
    int (*p)[length] = &variable_length_array;
    typedef int variable_int_array_t [length];
        Более всего сказанного, GNU-расширение позволяет создавать массивы переменной длины массивов переменной длины, что не позволено даже для new, где только верхний уровень может иметь переменную длину:
    void bar(int a, int b)
    {
        int auto_array[a][b]; //OK
        int (*dynamic_array)[b] = new int[a][b]; //ERROR 
    }
        Хорошая новость, что в C++14 будут введены VLAs, только во многом не совместимые c VLAs данного расширения и C99. По крайней мере, sizeof и typedef/using(c++11) для них будет ill-formed. Это позволит не наступить на грабли, ожидать от sizeof только компайлтайм-поведения. Ссылка на патч для gcc: http://gcc.gnu.org/ml/gcc-patches/2013-05/msg00445.html
        Я знаю, что многие считают, что VLAs в C++ становятся не нужными: для подобных целей существует vector, и никому не интересно, где в действительности выделяется память под элементы. Тем не менее, целью статьи ставилось показать такую возможность у gcc, чтобы впоследствии не удивиться.
        Ссылка на предложение о VLAs в open-std: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3639.html
        
    0

    Добавить комментарий

  8.     Расскажу, как однажды по собственной глупости, не ознакомившись во всех аспектах с вопросом в стандарте C++, я зарепортил свой первый и к тому же невалидный баг в багтрекер gcc.
        Ни для кого не секрет, что доступ к закрытым членам класса осуществить очень просто. Например, Майерс в своей книге возвращал из открытой функции ссылку на закрытый член. 
    Подобный пример: пощупать vptr собственными руками:

    class A
    {
            int id;

            virtual void foo()
            {
                    if ( id == 666 )
                    {
                            std::cout << "shot";                
                    }
            }

    public:
            A( int id ): id( id ) {}
    };

    void bar()
    {
            A a( 666 );
            void ( *foo )( A* const ) = **( reinterpret_cast< void ( *** )( A* const ) >( &a ) );
            foo( &a );
    }

        Более важно, что, помимо явного доступа к закрытым данным, также довольно просто заставить компилятор обойти проверку доступа закрытого имени. Порой такие вещи могут случиться ненарочно. Даже более вероятно ненарочно, чем специально.
        Например, пусть есть базовый A и производный от него B. Проблема в том, что имея указатель на A*, фактически ссылаемый на объект B, компилятору невозможно проверить уровень доступа виртуальной функции, на которую указатель фактически ссылается:


    class A
    {
    public:
            virtual void foo();
    };

    class B: public A
    {
            virtual void foo();
    };

    void bar()
    {
            A* a = new B;
            a->foo(); //B::foo()
    }

    Решение ?проблемы? могло бы заключаться в том, чтобы на стадии анализа класса B проверять вместе с сигнатурой виртуальной функции также ее уровень доступа в базовом классе. Замечу, что ключевое слово override из стандарта c++11, обеспечивающее гарантию замещения виртуальной функции, также не производит проверку уровня доступа функции из базового класса. Однако, и даже скорее всего, подобные трюки и манипуляции не являются нарушением защищенности.
        Интересный тикет достался Paolo Carlini для g++ - проводить проверку уровня доступа в процессе подстановки типа-параметра шаблона и при разрешении шаблонной перегрузки по принципу SFINAE http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51213. Подробнее можете почитать в его блоге https://blogs.oracle.com/pcarlini/entry/c_11_tidbits_access_control.
        Что касается невалидного тикета. Давайте рассмотрим следующий класс:


    class A
    {
            class Private{};
    public:
            static Private foo()
           {
                    return Private();
           }
    };

    Казалось бы, вне класса A создать объект класса A::Private невозможно. Только временный с помощью функции foo. То есть мы не можем иметь именованный объект типа Private снаружи класса A:
        A::Private error = A::foo() // Error.
    Но в новом стандарте это ограничение довольно легко обойти:
        auto normal = A::foo() // well-formed
        На первый взгляд, конечно, это кажется ошибкой. Но на самом деле синтаксический анализатор, как только встречает какое-либо имя, начинает производить его поиск, после чего производит проверку уровня доступа. В случае с auto такой поиск не производится - тип просто выводится из функции-инициализатора.
        И это не ошибка. Сам "баг": http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58129
    0

    Добавить комментарий

  9.     Все началось с того, что мне вместе с моими товарищами из института - всем, кто проходил курсы военной подготовки от военной кафедры, пришлось ехать на военные сборы под Курск в поселок имени маршала Жукова. Там у нас была присяга, экзамен и что-то похожее на КМБ в течение месяца. Вообщем, идея рассказывать впечатления о воинской жизни (коих было очень много) не входила в план данного рассказа. Скажу лишь, что еще когда-либо побывать в армии желания нет никакого, а этот месяц для меня, возможно, стал одним из самых бесполезных в жизни.
        Под конец сборов, внезапно, представилась возможность сразу после экзамена свалить на сутки раньше домой. Естественно, за свой счет. Несмотря на цену билета на поезд в 1200 руб, вызвалось 30 человек из 70-ти, примерно. Ну и я в том числе. Правда, денег на поезд было жалко, а сутками раньше пришла идея съездить стопом. Мол, друзья всю жизнь ездят по России - не боятся. А я, гоняя поездом по 2 раза в полгода из Москвы в Киров (1000 км) и обратно, никогда не решался. А тут предстоялось всего 550 км, правда, на тот момент я думал меньше.
        После экзамена в казарме быстро помылся, собрался. Друг из моего взвода жил в Курчатове - недалеко от Курска, и его отец на машине быстренько подкинул меня на трассу М2, которая была по пути в Курчатов. Спасибо ему. Вышел из машины - ожидал, что все как в городе - высунешь руку, постоишь, постоишь, а потом кто-нибудь и остановится. Но никто не останавливался.
        Чтобы просто не стоять на месте, решил идти вперед. Копейка рубль бережет, а тут может и километр полтысячи тоже. Шел, по дороге кушал сухпай, который майор дал нам с парнем, а мы его разделили на двоих. Также специально у него купил еще один за 150 руб. для какого-нибудь доброго шефа. Вдруг на горизонте на дороге начал замечать рост пробки, которая совсем скоро растянулась в длину около 1,5 км. Оказалось, у её истока строился мост через какую-то болотистую реку, из которой лошади и коровы пили воду.
    На мосту было одностороннее движение по светофору. Прошел через пробку - с другой стороны еще больше машин накопилось, еще более растянутой она оказалась. Люди выходили из машин, ругались друг на друга, кричали. Каждый спрашивал у меня как долго еще им стоять. А я шел, закинув наушник в одно ухо и слушая блэк-метал. Мысли были разные, понемногу начинал уже жалеть о своем выборе. Не понимал, то ли люди здесь какие-то другие, может быть, злые. То ли я что-то неправильно делаю. Вроде бы и немного прошло времени (около 3 часов), а только пешком прошел немало. Были мысли идти обратно. Все же, столь рано врядли кто-нибудь бы сдался. Недавно бегал марш-броски по лесам и поселкам - не останавливался. А тут идешь пешком, так бы и шел, и шел. Ведь ничего страшного.
        Прошел пробку, увидел две фуры стояли. Мужики бегали вокруг, чинили. Я встал за 100 метров от них и начал ловить. Думал, увидят - подъедут, прям как завтрак принесут в постель. Сам подойти стеснялся же. Через 15 минут они уехали. А я все стоял и стоял с поднятой рукой. Мимо на вишневой девятке два парня проезжало, что-то закричали в окно. Я снял наушник. "Ты под чем?", - заорали они, ржав как кони, что только что купались в реке. Ничего не ответил. Потом они начали разворачиваться, я уже думал, как бы портфель аккуратней скинуть, чтобы нетбук свой не сломать. Проехали мимо, по пути расстреляв меня из пальца.
        Пошел дальше. Прошел очередной поворот на Курск. Встал после него у трактира и начал ловить. Через минут 20 передо мной останавилась газель. Чисто деревенской наружности простой паренек открыл окно и спросил, далеко ли мне. Я говорю что, вообще-то, в Москву. А он, оказалось, едет в Железногорск и с М2 съедет в каком-то Фатеже. Но 30 км до него подкинет. Я обрадовался, как-никак, уже что-то:) Сразу сев, спросил меня, курю я или нет. Ответ его разочаровал, ибо, отчасти, останавился он сигарету попросить. Ну ничего, поговорили обо всем, немного о службе рассказал, о Москве, Зеленограде, о девках. Добрый и простой парень. Спасибо ему.
        Очень быстро приехали в Фатеж. Оказался приятный город или поселок. Я высадился, поблагодарил и пошел дальше. Прошел метров 200. Подъехала легковуха, из окна тетка спросила, в какую сторону в Москву. А я начал, что, мол, тоже в Москву еду, тоже только что интересовался. Как только махнул в нужную сторону - машина сразу уехала. Даже без спасибо. Точно так же через 5 минут следующая машина.
        Встал на дороге, начал ловить. Тут, как ни странно, совсем скоро подъехала здоровая фура. Встала рядом, я думал, не ко мне. Потом мужик бибикнул и вышел. Я подошел, а он давай рассказывать о себе. Немного поболтали. Вез он водку на 4 миллиона в машине за 2 миллиона. Подкинуть, сказал, не сможет, за это начальство может уволить, мол, его коллег ездит немало по этой трассе. А остановился он воды набрать из колонки. Дал мне бутылку минералки и уехал.
        Я пошел дальше, но бабушка, сидевшая напротив за торговлей горячей кукурузы отозвала и сказала стоять там, ловить. Говорит, фуры там часто останавливаются. Вчера два американца уехало на одной. Я даже обрадовался и встал. Посмотрел на часы - 19:30 - мои оставшиеся в части сослуживцы ужинают. Сразу понял, что жутко проголодался. Бабка, видно, поняла. Позвала и две кукурузины мне в пакете пихнула. Жутко полезная подгонка в такой момент. Спасибо ей.
        Я сел на бордюр и начал кушать. Через еще минут 20 проехала мимо меня здоровая фура и встала. На этот раз я сам решил подойти, да и бабка мне рукой замахала. Подошел, а там мужик, лет 50-ти, небольшого роста, суховатый, усатый вышел. Я спросил, не подкинет ли он вперед по трассе. А он спрашивал, где здесь банк, работает ли он. Я ответил, что об этом точно не знаю, переспросил свой вопрос, на что он все-таки ответил, что конечно довезет, если дождусь его из банка.
        Я даже не поверил. Сел на бордюр и стал ждать. Скоро он пришел, мы уселись, я вообще первый раз оказался в такой высокой машине. Ну и потихоньку разговорились. Сам он с Белгорода ехал, уже разгруженный, домой в Рязань. А в Рязань, раз уж встретил меня, решил ехать через Тулу, лишний крюк нарезать. Сначала не поверил. Но ехали-ехали... Разговор обо всем поднимали, первое время только про армию говорили. Серега рассказывал про работу свою старую, сколько дорог разъездил, где и как лучше ехать - про весь свой пережитый опыт. Магнитолу ни разу не включал. Мужик веселый и добрый оказался. Подумал, что очень повезло с ним.
        Как только сел, до Орла оставалось 150 км. И дальше еще 180 до Тулы. Время за разговором очень быстро пролетело - не заметил, как Орел проехали. И дальше.
        Потом встал вопрос - везти ли до Тулы или остановить где-нибудь на стоянке фур, а дальше Серега свернет на Рязань. Конечно же уговорил его не ехать. Жена у него, а он и так сколько километров уже в пути... Но что-то ехали и ни одной стоянки не видели. Время уже 23:00 было. Но потом решили остановиться на заправке с мини-кафе. Тут я достал из портфеля сухпай - подгонку Сереге, вспомнить армию да и сравнить нынешнее и прошлое питание. Он же сказочно обрадовался, разблагодарился. Ну и распрощались.
        Достал из портфеля и одел китель свой - холодно было. Мог бы и вообще в форме ехать, но был небольшой нюанс. Майор не знал, что я стопом еду. Узнал бы - все, капут. А вероятность встретить его или капитана на шоссе была, как казалось, высокой, поэтому придерживался гражданской формы.
        Пошел в мини-кафе на заправке. Тетка-продавщица хорошая оказалась. Рассказал ей свою мини-историю. Купил кофе, энергетика, сникерса и круассанов. Все вышло на 205 рублей, а 5 рублей не было. Тогда договорились на 200. Все же взял в кофе-автомате мокачино и отдал 5 рублей, за что несколько спасибо получил. Странно.
        Хотелось и дальше внутри остаться, но вышел ловить машину. Стоял полчаса. На другую сторону заправки подъехал камаз. Мужик вылез из него и начал бегать вокруг разбираться. Время было уже за полночь. Никто не останавливался. Да и это не было странно при такой скорости на шоссе.
        Вариант был один - пойти к камазу. Подошел, а водитель уже заводился. Попросился - тот безоговорочно согласился. Ну и поехали. Пацан молодой оказался, тульский. Ехал и безбожно матерился. Даже после армии концентрация матов была непривычна. До Тулы еще 80 км оставалось.
        Приехали также очень быстро. Высадил он меня на посту ДПС. Хороший мужик, откосивший. Спасибо ему.
        Около поста я отошел в кусты мимо небольшого огороженного забором пруда прямо возле шоссе. На обратном пути увидел маленькое что-то бегающее в кустах. Оказалось, маленькая кошечка жрать искала. Бегала, мяукала. На кис-кис сразу подбежала, не боясь. А пожрать у меня вроде ничего и нет, сухпай отдал Сереге. Тут вспомнил про тушенку на дне портфеля, которую в армию вез, но не сожрал - времени не было и ножа консервного. А сейчас только ножа нет. Вспомнил и про ножницы в кармане кителя. Распорол банку - высыпал все котяре.
        Вообщем привязалась она ко мне, ни на шаг не отходила. Я и так и эдак, на трассу вообще страшно выйти. Непонятно что делать. Думал на пост придти, отдать ее, куда ж девать. Решил пока помыть руки в пруду. В то время кошара нашла себе жертву - бабочку ночную или еще что. И я потихоньку убежал.
        До Москвы 190 км оставалось. Казалось, совсем чуть-чуть. Но тут наступал самый неприятный момент всей истории.
        Пешком дошел до заправки, которая стояла на другой стороне дороги. Естественно, останавливались там только ехавшие в другую сторону. Но я ждал и ждал. Никого. Пошел дальше. Фонарей не было, машины в сторону Москвы все реже и реже ехали. А была пятница, даже уже суббота. Весь поток шел из Москвы. Еще так холодно на трассе.
        Шел мимо леса, и было страшно, вдруг сзади кто-нибудь не увидит, задавит. Достал телефон, включил фонарь. Очень помог портативный аккумулятор, который с последней остановки все время заряжал мой телефон. В лесу помимо ветра слышалась возня какая-то. А может просто в моей голове. Тем не менее, выйдя на поле, нередко встречались ежи в траве.
        Так я долго прошел. Все шел и шел. На дороге ничего не попадалось. Думал дойти до чего-нибудь первого, будь-то заправка или еще что. А там стоять ловить дальше. Так и сделал. Через несколько километров дошел до заправки, которая опять, как на зло, была на другой стороне. Вариантов нет. Остался там. Стоял, ловил. На самом деле же ждал скорее рассвета. Очень холодно было. А время было чуть больше двух часов.
        Так и простоял до четырех часов, пока за мной не остановилась волга, из которой вышел седой дед. Подошел ко мне в упор. Предложил довезти 5 км до Барсуков. Всяко лучше чуть в машине посидеть погреться, да и ближе быть к дому хоть на 5 км. Но предупредил, что там на перекрестке хрен кто тоже остановится.
        Пока ехали, деду в голову пришла мысль остановить на светофоре, который стоял на трассе. Велел мне прямо на красном свете подходить к машинам и просить подвезти. Иначе и вправду хрен кто остановится. Вообщем в этом и самый главный урок оказался. Спасибо деду, ибо уже на второй раз, подойдя к машине, мужик из газели согласился довезти 30 км. Очень скромным оказался, необщительным. Может потому, что только проснулся.
        В машине у него задремал. А что, скоро подъем у наших, а я еще не спал. Немного вышло - мужик разбудил - приехали, а за окном стоянка и куча фур на ней стоит. А еще кафе здоровое. Даже не поверил. Спасибо мужику.
        Сразу двинул в кафе. Куча дальняков там было. Купил эклер, сникерс и компот. Пошел на трассу к фурам, искать готовых. Рядом мужик какой-то ходил, кричал, разорялся. Увидел меня и сказал, что лучше бы меня подобрал, а то ехал, видел, как я ловлю, но останавливаться тяжело было с большой скорости. А час назад его фуру обокрали прямо на этом же месте. Взяли 200 баксов, паспорт и все документы. Жалко мужика было. Потом подъехали полицейские, ну и я поскорее удалился.
        В фурах все спали, задвинув шторы. Но у самой крайней горела аварийка. Подошел сразу к водителю и попросил подкинуть. А он до Электростали ехал, сворачивал раньше. Но сказал, что на сто километров подбросит. А это же весьма-весьма.
        Оказался хорошим мужиком. Общительным. Только я уже не мог продолжать беседу - клевал носом. Сиденье было на классных амортизаторах, все прыгало и прыгало как на аттракционе. Тем не менее, с легкостью задремал. Проезжали Оку, Серпухов. Вспоминал, как год назад сюда рыбачить ездили. Ехали быстро.
        Скоро уже был поворот на трассу к Электростали. Спасибо мужику, что сразу безоговорочно подкинул. Высадился. Увидел надпись, что до Москвы всего 26 км.
    Не верилось. Уже полностью расцвело, поэтому снял китель. Магистраль совсем расширилась. Машин было немного. Проезжали автобусы. А время было немного больше шести.
        Дошел опять до ближайшей заправки и думал ловить машину. Фуры не ездят - в Москву нельзя после 6. Через минут 10 случайно словил автобус. Думал принципиально больше полтинника не дать за проезд. Зашел, спросил цену. А шофер говорит: "Ну давай полтинник". Автобус оказался из Протвино - научного городка вблизи Серпухова, где мы как раз на реке Протве устраивали рыбалку-отдых с одногруппниками.
        В автобусе сразу уснул. Проснувшись, не поверил глазам, увидев знак метро и большие здания кругом. Вроде вчера в армии строевой до столовой ходил. А тут на тебе - гражданка, свобода, метро.
        Прошло всего 4 дня, а я уже испытываю ностальгию, вспоминая. В следующий раз попробую осилить поездку домой.
    5

    Просмотреть комментарии

  10. Здорово, ребята. Наконец-таки открыл блог, как планировал долгое время. Писать собираюсь сюда обо всем: интересные и не интересные вещи из своей жизни, о собранных заметках о крестах из Evernote, как планировал раньше, ну и просто вспомнить правила орфографии и пунктуации русского языка из школы (по крайней мере на первое время). Сегодня же постараюсь опубликовать сообщение о своей недавней первой далекой поездке стопом из Курска.
    0

    Добавить комментарий

Архив блога
Обо мне
Обо мне
Загрузка...
Тема "Динамический просмотр". Технологии Blogger. Сообщить о нарушении.