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

    +1000

    1. 1
    const double pi = acos(-1.0);

    В каждой посылке codeforces - участника shentianxiao.

    P.S. Он - китаец

    Запостил: VisualPaul, 08 Января 2012

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

    • PI — POSIX'ная константа. В стандартной библиотеке pi нет.
      Ответить
    • Зато там есть M_PI
      (ссылка на стандарт через часик)
      Ответить
    • ОК, неправ. Но всё же M_PI - это общепринятое расширение, а acos(-1) вычисляется неточно.
      Если кто-то думает что M_PI нет в MSVC++ то это неправда:
      #define _USE_MATH_DEFINES
      #include <cmath>
      
      int main()
      {
        std::cout << M_PI << endl;
      }
      Ответить
      • >acos(-1) вычисляется неточно
        Как будто define точное значение задаёт.

        ps В glibc M_PI тоже есть
        Ответить
    • arctan(1.0)*4 дает более точное PI, чем дефайн.
      Ответить
    • M_PIl точнее чем acos(-1)
      Ответить
    • неточные вычисления неизбежны. вопрос в точности
      Ответить
      • #define PI 3.14 хватит всем.
        А в военное время значение синуса может достигать четырёх.
        Ответить
        • не хватит.
          Ответить
        • Из моего math.h (Linux glibc):
          # define M_PI		3.14159265358979323846	/* pi */
          # define M_PI_2		1.57079632679489661923	/* pi/2 */
          # define M_PI_4		0.78539816339744830962	/* pi/4 */
          # define M_PIl		3.1415926535897932384626433832795029L  /* pi */
          # define M_PI_2l	1.5707963267948966192313216916397514L  /* pi/2 */
          # define M_PI_4l	0.7853981633974483096156608458198757L  /* pi/4 */
          Ответить
    • Контрольный вопрос: в с нормальными объектными языками работали? Пусть даже Java (хотя это не лучший пример). Хотя бы Python, Ruby (про Common Lisp или Smalltalk я молчу). Если работали - то меня удивляет как вы могли не придти к тому же выводу, что и автор, если не работали - попробуйте и давайте обсудим C++ после этого. C++ - это плохая пародия на нормальную объектность, но в силу ряда причин он завоевал широкую популярность и, видимо, теперь уже не умрёт (как не умрут те же COBOL и FORTRAN). Удовольствия написание на нём кода не приносит - хотя по разным причинам делать этого приходится частенько. Проблема в том, что многие вещи, которые нормальные объектные языки предоставляют программисту в C++ приходится либо реализовывать с помощью тех или иных хаков, либо с помощью средств внешних по отношению к языку.
      Ответить
      • из списка я считаю что знаю Java, херово - Python и Ruby (что не мешает на них писать). ООП модель Common Lisp представляю (пробовал) но не более.

        Тем не менее.
        Пункт 1. В этом коде ООП нет. и рассуждения про ООП в вашем тексте бессмысленны
        Пункт 2. Далеко не всегда "толстая" стандартная библиотека - это хорошо. Скажем в качестве GUI в питоне есть tkiner - вещь неплохая но от Qt/GTK+ отстаёт и используется реже. Соответственно встаёт вопрос что она делает в стандартной поставке Python. Это только один пример. Стандарты де-факто зачастую удобнее. Особенно для таких языков как C/C++/Common Lisp, развитие которых регулируется ANSI/ISO - весьма нерасторопными организациями

        Пункт 3. ООП в Java почти не отличается от такого в C++. Отличий три:
        * Нет кейворда virtual зато есть final
        * Всё наследуется от Object
        * Нет множественного наследование

        1 - е отличие - косметическое. Просто не надо жадничать время на виртуальные вызовы без надобности
        2-е прекрасно компенсируется void * (я считаю что каст к Object и каст к void * одинаково ужасны)
        3-е отличие делает OOP в Java более простым но не делает его иным принципиально

        А про отсутвие в C++ больших стандартных библиотек - там есть зато более гибкие стандарты де-факто вроде Boost. Всё равно C++ для больших приложений где только стандартными библиотеками ни одного языка обойтись нельзя.

        P.S. К тому же вы что, просто пришли в тему про C++ дабы обосрать C++. Толсто, толсто.
        Ответить
    • хех, цодефорцес дагестанского происхождения, живущий на бабки пхпешника дурова...
      тут любой индус - дорогой заграничный гость
      Ответить
    • топик в разделе С++, поэтому тема маньяческой оптимизации кода, возможно, актуальна.
      использование стандартной константы в принципе возможно оптимизировать компилятором, используя fldpi
      любое расчетное или #define my_pi 3.14 это не позволяют в принципе.
      Ответить
      • ну вообще говоря с помощью builtin могут быть соптимизированны даже вычсления
        Ответить
        • могут-могут. К примеру студия 2005 оптимизирует очень неплохо.
          int test(int a, int b){
          return (++ a / b) + (a ++ % b);
          }
          если передать константы, то оно считает при компиляции и подставляет результат.
          А если передать какие-то вводные значения, то в конечном коде выполняется только 1 операция деления.

          а вообще я имел ввиду оптимизацию такого вида:
          lea eax, pi
          fld qword ptr [eax]
          или
          fldpi
          Ответить
    • http://www.youtube.com/watch?v=UDApZhXTpH8
      Ответить

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