понеділок, 20 грудня 2010 р.

Вычисляем число π через задницу

Вот вчера нашел довольно интересный код на языке C. Посмотрел на него, и вообще ничего не понял. Погуглил - как оказалось, никто не понял, как этот код работает:) Хотя вот общий механизм - в теле функции F_OO() содержится «рисованный» круг. А как мы знаем из геометрии, число π вычесляется по размеру круга. Вот и рассчитывается по этому кругу число π =/. И чем больше этот круг, тем точнее результат! Вот исходник - pi.c:
/* (c) Brian Westley, 1988 */
#define _ 0xF<00? --F<00||--F-OO--:-F<00||--F-OO--;
int F=00,OO=00;
main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
{
         _-_-_-_
     _-_-_-_-_-_-_-_-_
   _-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
   _-_-_-_-_-_-_-_-_-_-_-_
      _-_-_-_-_-_-_-_
         _-_-_-_
}
Теперь скомпилируем и запустим код:
[keed'0'@mandrivka ~]$ gcc -o pi pi.c
pi.c: In function ‘main’:
pi.c:4: warning: incompatible implicit declaration of built-in function 'printf'
[keed'0'@mandrivka ~]$ ./pi
3.141
[keed'0'@mandrivka ~]$
Как видим, он собирается и запускается нормально! Оно работает!
Мои познания языка C не велики, поэтому, если кто-то все-таки
разберет - напишите в комменты!

3 коментарі:

Brian Westley сказав...

Hello, I am Brian Westley, the writer of this C code.

Change "_" to "X" to make this easier to read:
#define X 0xF<00? --F<00||--F-OO--:-F<00||--F-OO--;

If you have:
X --> F=F-1, O=O-1
-X --> F=F-1

F = count of all X = area of circle
O = count of lines of X-X-X... = diameter of circle

4 * area / (diameter^2) = pi

keedhost сказав...

Thx, Brian! I`m not good programmer and this source I was can`t understand. But now all good))

Евгений Олейник сказав...

it's a simple)

Дописати коментар