1. C++ / Говнокод #25577

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    // https://github.com/QWalk/mainline/blob/b12ea3652226caef23c2f5fc7b168746c89096f2/src/system/Pseudopotential_so.cpp#L36
    
    doublevar legendre_so(doublevar x, int n)
    {
      switch(n)
      {
      case 0:
        return 1;
      case 1:
        return x;
      case 2:
        return .5*(3*x*x-1);
      case 3:
        return .5*(5*x*x*x - 3*x);
      case 4:
        return 0.125*(35*x*x*x*x -30*x*x +3);
      case 5:
        return 0.125*(63*x*x*x*x*x - 70*x*x*x + 15*x);
      default:
        error("Do not have legendre polynomial of order ", n);
        return 0; //shouldn't get here, but gets rid of a compiler message
      }
    }

    Вот нет чтоб через шаблоноговно нагенерировать эти свои многочлены Лагранжа.

    https://en.wikipedia.org/wiki/Legendre_polynomials#Rodrigues'_formula_and_other_explicit_formulas

    Интересно, сколько строк шаблоноговна на это придется потратить?
    И вообще, надо чтоб гомоиконность!

    Запостил: j123123, 29 Апреля 2019

    Комментарии (32) RSS

    • Хотя в шаблоноговне вроде бы плавучие питухи не поддерживаются, но можно что-нибудь сделать через std::ratio наверно
      Ответить
    • Ну и вот эта хренота например
      dcomplex Ylm(int l, int ml, Array1 <doublevar> r){
        assert(r.GetDim(0)==5);
        switch(l)
        {
        case 0:
          return 1;
      
        case 1:
          switch(ml){
            case -1:
              return sqrt(3.00/2.00)*dcomplex(r(2)/r(0),-r(3)/r(0));
            case 0:
              return sqrt(3.00)*dcomplex(r(4)/r(0), 0);
            case 1:
              return -sqrt(3.00/2.00)*dcomplex(r(2)/r(0),r(3)/r(0));
            default:
       //       error("Do not have spherical harmonics of order", ml);
              return 0;
          }
      
        case 2:
          switch(ml){
            case -2:
              return sqrt(15.00/8.00)*dcomplex( (r(2)*r(2)-r(3)*r(3))/r(1), -2*r(2)*r(3)/r(1) );
            case -1:
              return sqrt(15.00/2.00)*dcomplex(r(2)*r(4)/r(1),-r(3)*r(4)/r(1));
            case 0:
              return sqrt(5.00/4.00)*dcomplex((2*r(4)*r(4)-r(2)*r(2)-r(3)*r(3))/r(1),0);
            case 1:
              return -sqrt(15.00/2.00)*dcomplex(r(2)*r(4)/r(1),r(3)*r(4)/r(1));
            case 2:
              return sqrt(15.00/8.00)*dcomplex( (r(2)*r(2)-r(3)*r(3))/r(1), 2*r(2)*r(3)/r(1) );
            default:
         //     error("Do not have spherical harmonics of order", ml);
              return 0;
          }
      // ... и так далее

      Ведь наверняка это всё можно как-нибудь легко и элегантно переписать на шаблоны.
      Ответить
      • А еще оказывается, что в стандарте крестоговна функция sqrt не определена как constexpr! Ну и всякие std::exp, std::pow, std::abs std::fmin тоже нихуя не constexpr!
        Зато там есть функции Бесселя! Ну разве не круто!
        Ответить
    • показать все, что скрытоvanished
      Ответить
      • Ты математик штоле?
        Ответить
      • А, ну да. Опечатался. У Лагранжа тоже свои многочлены есть, для интерполяции
        Ответить
        • Я имею подозрения, что твоя учётка - одна из фаек Инкануса.

          Сколько твоих фаек я уже настрелял? Ах да, 3. Антонов, и т.п. не в щёт.

          3:0
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • А позвольте уточнить, какая это гниль, черная, серая или зеленая?
              Ответить
            • if IsBadPtr(Pointer(RandomRange(0,MaxInt)-RandomRange(0,MaxInt)),0) then
              showmessage('Не гниль')
              else
              showmessage('Гниль')
              Ответить
              • Хм. Оказывается, существует дохуя трешёвых функций для игр в "русскую рулетку":

                IsBadPtr
                IsBadReadPtr function
                IsBadWritePtr function
                IsBadCodePtr function
                IsBadStringPtrA function
                IsBadStringPtrW function

                Некоторые ещё и не потокобезопасные. В общем, пир души.
                Ответить
                • Помимо полного отсутствия потокобезопасности, у этих функций есть ещё один багор:
                  Dereferencing potentially invalid pointers can disable
                  stack expansion in other threads. A thread exhausting its stack,
                  when stack expansion has been disabled, results in the immediate
                  termination of the parent process, with no pop-up
                  error window or diagnostic information.


                  А суть такова: функции эти крайне тупы и работают за счёт ловли Access Violation при попытке чтения из заданного адреса. Но в винде есть одна штука, называющаяся «автоматическое расширение стека»: у каждого потока стек выделяется «лениво», по одной странице. На следующей же странице (которая находится за последней выделенной) повешен PAGE_GUARD, который генерирует исключение при попытке доступа, после чего автоматически снимается.
                  В нормальном режиме работы, доступ к стеку, в котором страницы полностью заполнены (но при этом максимальный размер не превышен), генерирует STATUS_GUARD_PAGE_VIOLATION, которое ловится штатным обработчиком, который, в свою очередь, коммитит новую страницу стека и тихо возвращает управление обратно. Но если мы передадим адрес, входящий в «guard page» говнофункциям вроде «IsBadReadPtr», они просто проигнорируют исключение, при этом PAGE_GUARD снимется! И когда потоку понадобится место в стеке — приложение просто тихо упадёт.

                  «IsBadWritePtr», впрочем, ещё хуйже: она просто пишет рандомный байт в каждую страницу из заданного диапазона и потом восстанавливает его обратно. Если в приложении больше одного потока — у нас появляется шанс получить просто адский багор.

                  https://blogs.msdn.microsoft.com/oldnewthing/20060927-07/?p=29563
                  http://blogs.microsoft.co.il/sasha/2010/01/15/isbadxxxptr-is-really-harmful-please-dont-use-these-functions/
                  Ответить
    • нахера козе баян :)?
      Ответить
    • Пока я смотрел ютуб, все легли спать... Пиздец.
      Ответить
      • Здравия желаю! Вам выписан штраф в размере 1000 (одной тысячи) рублей по статье 20.1 КоАП РФ за нецензурную брань в общественном месте. Оплатить штраф вы можете в любом отделении «Сбербанка» с восьми утра до девяти утра по чётным четвергам.
        Ответить
        • Ну и пиздец теперь, я тоже на штраф налетел. Пойду сыму мелочь с карты, пока не ограбили.
          Ответить
    • Генерировать —– это сложно. Лучше просто найти готовые формулæ и скопипастить.
      Ответить

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