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

    +18

    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
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    #include "math.h"
    #include <iostream>
    
    void Resolve(
    	float a, float b, float c,     // коэффициенты уравнения
    	int& count, float x[2]  // число корней, сами корни
    	// если корней нет, то значения x[0] и x[1] не определены
    	// если корень один, то значение x[1] не определено
    	// если  корней бесконечно много, то вернуть INT_MAX
    	// предполагается, что a,b,c и корни по модулю не превосходят 1E10
    	)
    {
    	const float MAXFREV = 1e-10f;
    	if (a==0.0 && b==0.0 && c==0.0)
    	{
    		count = INT_MAX;
    	} else
    	{
    		count = 0;
    		float d = b*b-4.0f*a*c;
    		if (d==0.0f)
    		{
    			if (2.0f*abs(a)>abs(b)*MAXFREV) 
    				x[count++] = -b/(2.0f*a);
    		} else if (d>0.0f)
    		{
    			float num = -b - sqrt(d);
    			if (2.0f*abs(a)>abs(num)*MAXFREV)
    				x[count++] = num/(2.0f*a); // (-b-sqrt(d))/2a
    			if (abs(num)>2.0f*abs(c)*MAXFREV)
    				x[count++]=(2.0f*c)/num;
    		}
    	}
    }
    
    
    int main () 
    {
    	float x[2];
    	int count;
    	Resolve (0.0001f,2.000f,0.001f, count, x);
    	std::cout << "count= " << count;
    	if (count<=2)
    		for (int i=0; i<count; ++i)
    			std::cout << ", x[" << i << "]= " << x[i];
    	std::cout<<std::endl;
    	return 0;
    }

    Просто решение квадратного уравнения.
    На флоатах.
    Числа подобраны так, что классическая формула лажает, выдавая второй корень -0.000596 вместо -0.0005

    Запостил: TarasB, 18 Июня 2013

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

    • Я хочу видеть хакерское решение на попугаях.
      Ответить
    • > if (d==0.0f)

      О_о. Этот код вполне достоен находиться на этом сайте.
      Ответить
      • Да, всё ещё сложнее, чем я думал, погрешность при вычислении дискриминанта может превратить уравнение с решением в уравнение без решения и наоборот и хз как это бороть.
        Ответить
        • Всегда считать два комплексных корня, насрав на никому не нужную проверку дискриминанта. ;) Хотя там будет та же самая проблема с шатанием младших битов, которая не даст толком вычислить корень.
          Ответить
        • Еще как вариант - сделать небольшую мертвую зону в обе стороны от нуля, в которой выдается ошибка "а хер бы его знал".
          Ответить
          • Вот видишь, вариант ==0.0 не хуже прочих.
            Ответить
      • как нас хорошо валили на 1ом курсе на таких вещах)
        Ответить
        • Здесь лучше всего валить удачным контрольным примером, а не просто фразой "так не делают" ;) Запомнится надолго.
          Ответить
          • было было, препод дает "ружье" заряженное особым "патроном" и говорит, стреляй, я нажимаю на курок и пуля летит в мою ногу
            Ответить
    • показать все, что скрытоКому упало твоё питухуравнение? У вас всех питушизм головного мозга, нормальных примеров(реальных) придумать не можете, а питушню всякую - срадостью.


      Что ты этим "уравнением" считать собрался? Бесполезные задачки из детсада?
      Ответить
      • Питух, я тебе всё вчера объяснил : http://govnokod.ru/13180#comment182082
        Ответить
        • показать все, что скрытоПитух, я проде писал форму задачи - я не вижу тут конусов, ни лучей, ни примеров, а вижу питушню.


          В твоём том выхлопе( который я не видел по причине того, что это убожство писало безрукое анскильное питушко типа тебя) я вижу ссылку на выхлоп какого-то питуха, который сложнее "идеального" решения детсадовской питушни не писал. Который не понимает разницу между программированием и борьбой с особенностями питушарского флоата. Знай он хоть 100500раз - он питух, который нихрена вменяемого не напишет.


          И такие питухи, которые постят пасты других питухов - питухи. Если ты не можешь сформулировать задачу, которую тебе надо решить - ты питух, а твой код питушня, который работает на изимодной копипасте формулок из интернетов(учебников).

          И когда такие питухи пытаются что-то из себя стриоть - мне становится смешно.
          Ответить
          • Ехал питух через питух,
            видит питух, в питухе питух
            сунул питух питух в питух
            питух питух питух питух

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

            А пока я засчитываю тебе слив, на первой же задаче, в которой возникают реальные проблемы с точностью промежуточных вычислений, и в которой твои попугаи будут сосать своими клювами у плавучки, наскипидаренной к тому же на иррациональные функции, ты предпочёл отпиздеться, что это всё питушня, вместо того, чтобы начать думать.
            Доказательств своей скилльности ты не предоставил, так что пока мы все будем считать тебя питухом.
            Ответить
            • показать все, что скрытотвоя жопа разорвана в клочья. Теперь понятно что последняя буква в твоем нике означает баттхёрт
              Ответить
              • Да, миня просто зотролели по полной.
                Ответить
                • >твоя жопа разорвана в клочья.
                  Та пиздец, вижу ты вне себя от гнева.

                  Сначала бегает по двору "дайте мне задание". Дали десяток.
                  В итоге дешевый слив "нормальных примеров(реальных) придумать не можете", "не интересно", итп.

                  Надоели скучные обоипримеры, в общем.
                  Ответить
            • показать все, что скрыто>Я даю тебе задание - вывести уравнение для точки пересечения конуса и луча. Если ты таки напряжёшь то, что у тебя вместо мозгов под черепной коробкой, то ты довольно быстро придёшь к квадратному уравнению.

              Питух. Мне не нужно решать питушню к которой пришел твой недомозг. Мне нужен конкретный пример. У тебя, питуха, никогда не будет разброса даже 3порядка в твоей говноискалке, иначе она не взлетит - значит ты пропитушился.


              Ещё питух, если я напишу решайко которая решат для чисел в пределах пары порядков - ты начнёшь кукарекать, что нихрена на реботает, ибо ты питух. Поэтому мне не интересно решать твою бесполезную питушню.


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


              Поэтому хотя с конусами не пропитушись и выкатывай пример который ищет столкновение с твоим конусом, а не делает нипойми какую питушню.


              Меня не интересует мнение анскильных питухов обо мне. Меня не интересует скилл реализации питушнятский решений проблемы от питушков. Я не вижу смысла в твоём выхлопе. В соседнем пациент хоть хочет искать икс в окружности с радиусом v^2-g. Мне не ясно только зачем - но хоть обозначил требуему точность и примеры - а ты питух.
              Ответить
              • > ибо решил слиться с самой задачи на знакомое тебе решением
                Ты думаешь, я это дело не пилил? Это называется проекция своей анскильности на других.
                Решения я от тебя не увижу, только визжание.

                Короче, питух засчитан.
                Ответить
                • показать все, что скрытоДа, да. Смешная лалка, ну кукарекай дальше - вон питушки тебя плюсанули не поняв твоего слива.
                  Ответить
                  • УТИБЯ АНСКИЛЛ
                    ПИТУХ ЗАСЧИТАН
                    Ответить
                  • Админы, пожалуйста, выдайте бан товарищу [superhackkiller1997].
                    Ответить
                    • У нас так не принято.
                      Ответить
                    • за модерастией на хабр
                      Ответить
                    • За что в бан то? Пропаганда питухарастии?
                      Ответить
                    • Так он же ничего не нарушал!
                      Ответить
                      • Так тут правил и нет, нарушить не получится даже если сильно захотеть? :)
                        Ответить
                        • Ну, тут нельзя слишком много вайпать, так что правила - они везде есть.
                          Ответить
                          • > тут нельзя слишком много вайпать
                            Потому что руки устанут ;)

                            > слишком много
                            Т.е. немного (3-5 тем) можно?
                            Ответить
                            • Ну последнего школовайпира еще не забанили.
                              Ответить
                              • Значит он вайпал не слишком много, и не нарушил правил.
                                Ответить
                                • да ну его нахуй, так же веселее. а то у нас прям институт благородных девиц.
                                  господа, учитесь держать удар достойно, в жизни пригодится.
                                  Ответить
                                  • > а то у нас прям институт благородных девиц
                                    Да я то вообще толерантен к долбоёбам, я их иногда даже кормлю, если они голодны ;)
                                    Ответить
                                  • >учитесь держать удар достойно,
                                    Ну кто бы гойворил.
                                    На прошлой неделе, не мы тут бегали и призывали страйкера навести справедливость.
                                    Как по мне чем больше говна - тем лучше говнокоду.
                                    Ответить
                                    • > Как по мне чем больше говна - тем лучше говнокоду.
                                      Больше треша, угара, зоофилии и обмазывания стен говном?
                                      Всё хорошо в меру, у нас же не интернат для душевнобольных.
                                      Ответить
      • Уходи.
        Ответить
    • Если нужно получить максимальную точность в float формате, то можно просто скорректировать результат полученный классическим подхода. Но лучше использовать double, long double типы для таких вычислений. Дана корректировка осуществлена простым методом перебора с минимальным шагом, поэтому она медленная!!!.
      typedef union
      {
      	float f;
      	unsigned int ui;
      	struct
      	{
      		unsigned int f : 23;
      		unsigned int e : 8;
      		unsigned int s : 1;
      	} s1;
      	struct
      	{
      		unsigned int f : 23;
      		unsigned int se : 9;
      	} s2;
      } uft;
      
      void Correct(float a, float b, float c, float &x)
      {
      	if (((uft){.f=a}.s1.e!=0xff)&&
      		((uft){.f=b}.s1.e!=0xff)&&
      		((uft){.f=c}.s1.e!=0xff)&&
      		((a!=0.0f)||
      		 (b!=0.0f)))
      	{
      		uft oxx={.f=x},orr={.f=a*x*x+b*x+c};
      		orr.s1.s=0;
      		
      		if ((oxx.s1.e==0xff)||(orr.s1.e==0xff))
      			return;
      		
      		uft x1,oxx1=oxx,orr1=orr,oxx2=oxx,orr2=orr;
      		
      		while (orr1.f)
      		{
      			x1.f=(uft){.s2.se=oxx1.s2.se,.s2.f=1}.f-(uft){.s2.se=oxx1.s2.se,.s2.f=0}.f;
      			uft x2={.f=oxx1.f+x1.f};
      			uft r2={.f=a*x2.f*x2.f+b*x2.f+c};
      			r2.s1.s=0;
      			
      			if ((x2.s1.e!=0xff)&&(r2.s1.e!=0xff)&&(orr1.f>=r2.f))
      			{
      				oxx1 = x2;
      				orr1 = r2;
      				continue;
      			}
      			
      			break;
      		}
      		
      		while (orr2.f)
      		{
      			x1.f=(uft){.s2.se=oxx2.s2.se,.s2.f=1}.f-(uft){.s2.se=oxx2.s2.se,.s2.f=0}.f;
      			uft x2={.f=oxx2.f-x1.f};
      			uft r2={.f=a*x2.f*x2.f+b*x2.f+c};
      			r2.s1.s=0;
      			
      			if ((x2.s1.e!=0xff)&&(r2.s1.e!=0xff)&&(fabsf(orr2.f)>=fabsf(r2.f)))
      			{
      				oxx2 = x2;
      				orr2 = r2;
      				continue;
      			}
      			
      			break;
      		}
      		
      		if (orr1.f<orr.f)
      		{
      			if (orr2.f<orr1.f)
      				x=oxx2.f;
      			else
      				x=oxx1.f;
      		}
      		
      		else if (orr2.f<orr.f)
      			x=oxx2.f;
      	}
      }
      
      void Resolve(float a, float b, float c, int& count, float x[2])
      {
      	count=0;
      	
      	float d=b*b-4.0f*a*c;
      	
      	if (d>=0.0f) {
      		uft x1={.f=(-b+sqrtf(d))/(2.0f*a)};
      		uft x2={.f=(-b-sqrtf(d))/(2.0f*a)};
      		Correct(a, b, c, x1.f);
      		Correct(a, b, c, x2.f);
      	 
      		if (x1.s1.f!=0xff)
      			x[count++]=x1.f;
      		
      		if ((x2.s1.f!=0xff)&&(x2.f!=x1.f))
      			x[count++]=x2.f;
      	}
      Ответить
      • > -b+sqrtf(d)
        с точки зрения вычмата, это выражение является говном для положительного b, есть риск вычесть близкие числа

        И мой код с отрицательными b будет делать говно тоже.
        Ответить
      • Используется лишняя функция fabsf. Нужно заменить строчку:
        if ((x2.s1.e!=0xff)&&(r2.s1.e!=0xff)&&(fabsf(orr2.f)>=fabsf(r2.f)))

        на строчку:
        if ((x2.s1.e!=0xff)&&(r2.s1.e!=0xff)&&(orr2.f>=r2.f))
        Ответить
      • void Resolve(
                     float a, float b, float c,     // коэффициенты уравнения
                     int& count, float x[2]  // число корней, сами корни
                     // если корней нет, то значения x[0] и x[1] не определены
                     // если корень один, то значение x[1] не определено
                     // если  корней бесконечно много, то вернуть INT_MAX
                     )
        {
            if ((a==0.0f)&&(b==0.0f)&&(c==0.0f))
            {
                count = INT_MAX;
            }
            
            else if (a==0.0f)
            {
                count=0;
        
                uft x1={.f=-c/b};
                Correct(a, b, c, x1.f);
                
                if (x1.s1.e!=0xff)
                    x[count++]=x1.f;
            }
            
            else
            {
                count=0;
                
                float d=b*b-4.0f*a*c;
                
                if (d>=0.0f)
                {
                    uft x1={.f=(-b+sqrtf(d))/(2.0f*a)};
                    uft x2={.f=(-b-sqrtf(d))/(2.0f*a)};
                    Correct(a, b, c, x1.f);
                    Correct(a, b, c, x2.f);
                    
                    if (x1.s1.e!=0xff)
                        x[count++]=x1.f;
                    
                    if ((x2.s1.e!=0xff)&&(x2.f!=x1.f))
                        x[count++]=x2.f;
                }
            }
        }
        Ответить
        • О великий байтопитух! Поясни как производится корректировка и почему для этого нужны питушения в мантису порядком?
          Ответить
          • Патамучто это плавающий питух, который априори говно. И чем вы быстрее это поймёте, чем будет лучше.
            Ответить
            • Сделай на целом питухе.
              Ответить
            • сухопутный питух, где целочисленное решение хоть одной питушиной задачи, тут озвученной?
              ты всё доказываешь превосходство сухопутного питуха - ну так покажи уже, кончай пиздеть
              Ответить
              • http://lib.rus.ec/i/50/407850/i_053.jpg

                На переднем плане - плавающий питух
                Ответить
                • "Морской петух — морская придонная рыба семейства тригловых."
                  Ответить
                • А у меня лучше.
                  http://avivas.ru/img/news/201207/489514978674.jpg

                  Угадай кто?
                  Ответить
              • Это ущербанская задача, которая не обгаваривает нихрена. Реальная задача обгаваривает входные и выходные данные. Решать задачу ради задачи - это питушизм.


                Что даёт этот код? Нихрена. Поэтому царю лень пилить питушню. Зачем в его конусах точность даже 3порядка - она не нужна, но он жешь гениальный решатель питушни. Поэтому пусть приводит реальную задачу - что и как он считает и т.п. А уж я сам выбиру как её считать.
                Ответить
                • я сказал хоть одной
                  где решение про снаряд?
                  Ответить
                • Давай твой вариант задачи, оформленной по всем твоим правилам?
                  Ответить
    • Я угадаю эту мелодию решу это уравнение за сто шагов:
      #include <iostream>
      #include <cmath>
      #include <complex>
       
      typedef std::complex<float> complex_float;
       
      const float a = .0001f;
      const float b = 2.f;
      const float c = .001f;
       
      float complex_sqared_len(const complex_float & value)
      {
          return value.real() * value.real() + value.imag() * value.imag();
      }
       
      complex_float calc(const complex_float & x)
      {
          return c + x * (b + x * a);
      }
       
      int main(int, char **)
      {
          std::cout << "hello" << std::endl;
          float grad_step = .001f;
          complex_float solution(10, 10);
       
          for(int i = 0; i<100; i++)
          {
              const complex_float real_up = calc(solution + complex_float(grad_step, 0.f));
              const complex_float real_dn = calc(solution - complex_float(grad_step, 0.f));
              const complex_float imag_up = calc(solution + complex_float(0.f, grad_step));
              const complex_float imag_dn = calc(solution - complex_float(0.f, grad_step));
       
              complex_float gradient(complex_sqared_len(real_up) - complex_sqared_len(real_dn),
                                     complex_sqared_len(imag_up) - complex_sqared_len(imag_dn));
              gradient /= grad_step;
       
              solution -= .1f * gradient;
          }
          std::cout << "solution : " << solution << std::endl;
      }
      Знаю, что написано на трояк с натяжкой, просто очень хочется спать и через пять часов на работу.

      http://ideone.com/JwDUGG

      Да, если по-чесноку: не раскрыл бы Тарас все карты про проблемы типичных решений, то я бы сначала посчитал по дискриминанту, а потом уже взялся бы за градиент.
      Ответить
      • Хрень написал. В тридцать шестой строке нужно делить на удвоенный шаг.
        Ответить
      • > sqared
        scared?
        шкваред!
        Ответить
        • Лол, "комплекс напуганный длин" :) В полуночных мозгах проверка орфографии глючит адово.
          Ответить
    • Ахтунг! Говнокод зараразился раком! Теперь кроме одной голубогривой лошадки, недосленг, состоящий из исковерканных слов, употребляют все.
      Это печально.
      Ответить
      • Вы правы. Ещё можно понять профессиональный жаргон. Но когда коверкают слова, это питушизм какой-то.
        Ответить
        • "питушизм"

          :'(
          Ответить
        • > питушизм
          Питушиный Птичий грипп свирепствует на говнокоде, унося все новые и новые жизни.
          Ответить
        • Согласен с вами, коллега. Патологически не переношу глумление надо родным языком и прочий питушизм ансклильных лалок
          Ответить
      • Ну не все. Да и тут так всегда.
        Пофорси немного "пиписюнчик" или подобную хуиту и все будут повторять.
        Ответить
      • Ach nein! Отучаемся говорить за всю сеть.
        Ответить
    • Питухи :-D
      Ответить
    • Она встала с места, процокала тонкими каблучками по ступеньках и, встав возле меня, продолжила:
      Ответить

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