Форум Херсона. Форум Херсонской молодежи, флейм, фотографии Херсона, политика в Херсоне, сетевой форум, сети Херсона


Приветствуем на Форум Херсона. Форум Херсонской молодежи..

На данный момент Вы находитесь на форуме как Гость и имеете очень ограниченные возможности и права. Что бы писать или отвечать в темах, загружать картинки, файлы на форуме Вам нужно зарегистрироваться, что совершенно бесплатно. Регистрация очень быстрая, не откладывайте эту процедуру!

Если возникнут проблемы с регистрацией напишите нам.

Галерея форума Блоги пользователей Список банов
Вернуться   Форум Херсона. Форум Херсонской молодежи. > > >
Регистрация СправкаСтатистика Пользователи Календарь Сообщения за день

Программирование Все вопросы по написанию программ

Тема: Копилка Ответить в теме
Ваше имя пользователя: Для входа нажмите здесь
Проверка вопроса системы антиспама "NoSpam!"
Стодвацатьадмин дабавить двацать
Image Verification
Пожалуйста, введите шесть букв и/или цифр, которые изображены на картинке.

Заголовок:
  
Сообщение:
Иконки для сообщения
Вы можете выбрать иконку, характеризующую сообщение:
 

Дополнительные опции
Другое

Просмотр темы (Новые вначале)
28.06.2009 10:14
Lester Быстрое возведение в степень( сложность алгоритма O(lnn) вместо O(n) ).

PHP код:
// возведение t в степень k
int powerint tint k )
{
       
int res 1;
       while( 
)
       {
          if( 
)
              
res *= t;

          
*= t;
          
>>= 1;
      }

      return 
res;

http://ru.wikipedia.org/wiki/%D0%90%...B5%D0%BD%D1%8C
17.06.2009 00:42
Lester Программа, которая работает одновременно в C, C++, Haskell, Ruby, Python, Perl(x2), HTML, tcl, bash, zsh, make, bash и brainfuck:

PHP код:
# /* [  <!-- */ include  <stdio.h> /*   \ 
  #{\ 
`""""true \\#{"\n#"};           \ 
  \ 
if [ -n "$ZSH_VERSION" ]; then           \ 
  \ 
  echo exec  echo I\'m a zsh script.; \ 
  \ 
elif [ -n "$BASH_VERSION" ]; then        \ 
  \ 
  echo exec  echo I\'m a bash script.; \ 
else  \ 
  echo exec  echo  I\'m  a sh  script.;    \ 
fi
`;  #\ 
BEGIN{print"I'm a ""Ruby"  :"Perl",  " program.\n";  exit; }  
  
#\ 
%q~             
  
set dummy =0puts[list "I'm"  "a"  "tcl"  "script."]; exit    
  
all: ; @echo "I'm a Makefile."           
  
#*/ 
/*: */ 
enum {ab};             
   
static 
int c99(void) {          
  
#ifndef __cplusplus /* bah */         
  
unused1: if ((enum {ba})0)           
  (
void)0
#endif            
  
unused2:  return a;      
}   
static 
int trigraphs(void) {          
   
  return 
sizeof  "??!"  ==  2;     
}   
char X;                
   
int main(void) {              
   
  
struct X  {         
   
     
char  a[2];     
  }; 
  if (
sizeof(X)  !=  1) {        
   
printf("I'm a C++ program (trigraphs %sabled).\n",          
   
   
trigraphs()  ? "en"  "dis"); 
   
}else if (
1//**/2 
  
  
)unused3 : { ;  
    
printf("I'm a C program (C%s, trigraphs %sabled).\n",  
        
c99() ? "89 with // comments" "99",  
        
trigraphs() ? "en" "dis");  
  } else {  
    
printf("I'm a C program (C89, trigraphs %sabled).\n",  
        
trigraphs() ? "en" "dis");  
  }  
  return 
0;  
/* 
# \ 
> main :: IO () -- -- \ 
> main = putStr "I'm a Literate Haskell program.\n"   
# \ 
]>++++++++[<+++++++++>-]<+.>>++++[<++++++++++>-]<-.[-]>++++++++++ \   
[<+++++++++++>-]<-.>>++++[<++++++++>-]<.>>++++++++++[<++++++++++> \ 
-]<- - -.<.>+.->>++++++++++[<+++++++++++>-]<++++.<.>>>++++++++++[ \ 
<++++++++++>-]<+++++.<<<<+.->>>>- - -.<+++.- - -<++.- ->>>>>+++++ \ 
+++++[<+++++++++++>-]<- - -.<<<<<.<+++.>>>.<<<-.- ->>>>+.<.<.<<.> \ 
++++++++++++++.[-]++++++++++"""` 
# \ 
print "I'm a Python program."; """[-][--><html><head> 
<!--:--><title>I'm a HTML page</title></head><body> 
<!--:--><h1>I'm a <marquee><blink>horrible HTML</blink></marquee> page</h1> 
<!--:--><script language="Javascript"> 
<!--: # \ 
setTimeout( // \ 
  function () { // \ 
   document.body.innerHTML = "<h1>I'm a javascript-generated HTML page</h1>"; // \ 
  }, 10000); // \ 
//--> 
</script><!--: \ 
</body></html><!-- } # \ 
say "I'm a Perl6 program", try { " ($?PUGS_VERSION)" } // "", "."; # """ # */ 
#define FOO ]-->~ 
24.05.2009 06:52
Lester Хотите запутать исходный код( например, когда его надо отдавать недобросовесному заказчику )? Маленькая утилитка cobfusc в Linux позволит вам сделать это( при этом все ес-но будет компилироваться без проблем ), вот пример результата:

PHP код:
static void q18(q19 q2,int q3,int q4); 
static 
void q20(q19 q2,int q3,int q4);q21(int)q22(q19 q2,int q3,int q4);q21
q19)q23(int q24,int q25)<%int q26;q19 q2;if(q27(sizeof(unsigned char*),q25))<% 
return 
NULL;%>if(q27(sizeof(unsigned char*),q24))<%return NULL;%>q2=(q28*)q29
sizeof(q28));if(!q2)<%return NULL;%>memset(q2,0,sizeof(q28));q2->q30=(unsigned 
 char
**)q29(sizeof(unsigned char*)*q25);if(!q2->q30)<%q31(q2);return NULL;%>q2 
->q32=0;q2->q33=0;q2->q34=0;q2->q35=0;q2->q36=0;for(q26=0;(q26<q25);q26++)<%q2 
->q30<:q26:>=(unsigned char*)q37(q24,sizeof(unsigned char));if(!q2->q30<:q26:> 
)<%for(--
q26;q26>=0;q26--)<%q31(q2->q30<:q26:>);%>q31(q2->q30);q31(q2);return  
NULL;%>%>q2->q24=q24;q2->q25=q25;q2->q38=0;q2->q39=(-(1*(1*1+0)+0));q2->q40=0
q2->q41=(1*(1*1+0)+0);q2->q42=0;for(q26=0;(q26<q43);q26++)<%q2->open<:q26:>= 
(
1*(1*1+0)+0);q2->q44<:q26:>=0;q2->q45<:q26:>=0;q2->q46<:q26:>=0;%>;q2->q47=0
q2->q48=0;q2->q7=0;q2->q5=0;q2->q8=q2->q24-(1*(1*1+0)+0);q2->q6=q2->q25-(1+0); 
return 
q2;%>q21(q19)q49(int q24,int q25)<%int q26;q19 q2;if(q27(q24,q25))<% 
return 
NULL;%>if(q27(sizeof(int*),q25))<%return 0;%>if(q27(sizeof(int),q24))<% 
return 
NULL;%>q2=(q28*)q29(sizeof(q28));if(!q2)<%return 0;%>memset(q2,0,sizeof 
(q28));q2->q48=(int**)q29(sizeof(int*)*q25);if(!q2->q48)<%q31(q2);return 0;%> 
q2->q32=0;q2->q33=0;q2->q34=0;q2->q35=0;q2->q36=0;for(q26=0;(q26<q25);q26++)<% 
q2->q48<:q26:>=(int*)q37(q24,sizeof(int));if(!q2->q48<:q26:>)<%q26--;while(q26 
>=0)<%q31(q2->q48<:q26:>);q26--;%>q31(q2->q48);q31(q2);return 0;%>%>q2->q24
q24;q2->q25=q25;q2->q39=(-(0+1));q2->q40=0;q2->q47=(1*1+0);q2->q50=0;q2->q51
30.04.2009 10:59
PhoeniXX Немного о .Net-е.
В самом .Net-е нет аналогов union из c++. Но можно сделать его подобие таким образом:
Код:
    [StructLayout(LayoutKind.Explicit)]
    public struct TestStruct
    {
      [FieldOffset(0)]
      public int a;
      [FieldOffset(0)]
      public float b;
    }
Работает только для Value типов.
29.04.2009 09:55
Marchello Ну вот, из серии быстродействия:

Получение abs значения float-а (путем сбрасывания знакового бита)
Код:
float m_absf(float x)
{
    DWORD t = (*((DWORD*)&x)) & 0x7fffffff;
    return *((float*)&t);
}
- наверное платформозависимо, но в винде работает ))

Потом, получение квадратного корня, не помню какая погрешность, но она конечно есть. Это я высмотрел в движке Q3.
Код:
float m_sqrt(const float &x)
{
    DWORD  tmp = ((ONE_AS_INTEGER<<1) + ONE_AS_INTEGER - *(DWORD*)&x)>>1;
   float  y   = *(float*)&tmp;
   return x*y*(1.47f - 0.47f*x*y*y);
}
где ONE_AS_INTEGER - это магическое число определенное как
#define ONE_AS_INTEGER ((DWORD)(0x3F800000))


из той же серии, только вычисляет 1.0f / sqrt(x)
Код:
float m_rsqrt(float number)
{
    int   i;
    float x2, y;
    const float threehalfs = 1.5f;

    x2 = number*0.5f;
    y  = number;
    i  = *(long*)&y;                        
    i  = 0x5f3759df - (i>>1);          
    y  = *(float*)&i;
    y  = y*(threehalfs - (x2*y*y));
//    y  = y*(threehalfs - (x2*y*y));   // for greater accuracy

    return y;
}
- если раскоментить строку перед ретурном - повышается точность, почти до 100% (но падает скорость выполнения конечно, но не много).

А еще мне понравился ассемблер математического процессора,
вот как например можно вычислить синус/косинус, корень (и т.д.) на нем:
Код:
float m_sin_asm(float angle)
{
    volatile float res;
    _asm
    {
        FLD angle
        FSIN  // если будет FCOS - будет косинус, если FSQRT - будет корень и т.д.
        FSTP res
    }
    return res;
}
- это самый простейший вариант использования.

Часто нужно вычислять синус и косинус сразу для одного угла (например при рисовании круга), тогда можно сделать так:
Код:
void m_sin_cos_asm(float *sn, float *cs, float angle)
{
    _asm
    {
        FLD angle
        FSINCOS
        MOV edx, DWORD PTR [cs]
        MOV eax, DWORD PTR [sn]
        FSTP DWORD ptr [edx]
        FSTP DWORD ptr [eax]
    }
}
28.04.2009 22:22
Lester
Копилка

Топик для постинга небольших забавных/нужных кусков кода, интересных фактов и т.п.
  • в С/С++ можно менять местами индекс и имя массива, например 5["abcdef"] == 'c', или i[A].
  • в макросах тоже можно использовать переменное кол-во параметров с помощью __VA_ARGS__
  • можно "создать" массив с любым начальным индексом используя такой код:
PHP код:
int basearray[10];
int *array = &basearray[ -]; // массив с начальным индексом 1 
  • alloca - аналогично malloc, но автоматически очищает выделенную память при выходе из функции

Ваши права в разделе
Вы не можете создавать темы
Вы можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.

Время на сервере: 01:59.

Регистрация Справка Пользователи Календарь Сообщения за день

vBulletin 3, Copyright © 2000-2024, Jelsoft Enterprises Ltd.
Русский перевод: zCarot, Vovan & Co