| 
| 
 | Вопрос # 2 221/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!У меня вопрос: как можно самостоятельно вычислить число Pi до N знаков после запятой?)
 Заранее спасибо!
 
|  |   Вопрос задал: IlluminatI (статус: 2-ой класс)Вопрос отправлен: 21 декабря 2008, 19:45
 Состояние вопроса: открыт, ответов: 3.
 |  Ответ #1. Отвечает эксперт: Ученый Здравствуйте, IlluminatI! Пошарился и нашел вот такой примерчик (в приложении): Приложение:Переключить в обычный режим   unit pi_; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm)   Label1: TLabel;  procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var     begin pi:=0; n:=1; t:=StrToFloat(edit1.text);  while elem >= t do begin  elem:=1/(2*n-1);  if n MOD 2 = 0    then pi:=pi-elem    else pi:=pi+elem;  n:=n+1; end; pi:=pi*4;  end; end.
|  | Ответ отправил: Ученый (статус: 8-ой класс)Время отправки: 21 декабря 2008, 20:02
 
 |  Ответ #2. Отвечает эксперт: Градов Ю.М. Здравствуйте, IlluminatI!
 uses ..........., Math;
 
 var p: double;
 const n=5; //задаете точность
 begin
 p:=Arctan(1) * 4;
 Label1.Caption:=FloatToStr(p);
 if n<16 then p:=Int(p*Power(10,n))/Power(10,n);
 Label2.Caption:=FloatToStr(p);
 //  все равно процессор позволяет работать максимум с 16 десятичными разрядами
 end;
 
|  | Ответ отправил: Градов Ю.М. (статус: 8-ой класс)Время отправки: 22 декабря 2008, 12:03
 
 |  Ответ #3. Отвечает эксперт: Николай Рубан Здравствуйте, IlluminatI!
 Осмелюсь предложить и свой вариант решения. Возможно он не так точен как хотелось бы, но дает возможность найти значение дроби с заданной точностью N. Осталось только найти дробь которая максимально близко выражает число ПИ. Алгоритм основан на классическом делении в столбик.
 
 
 var i,a,b,c,n:integer;
begin
  a:=355; b:=113; //дробь значение которой близко к значению ПИ.
  n:=100; //точность
  write(a div b,'.');
  a:=a mod b;
  for i:=1 to n do begin
    a:=a*10;
    c:=a div b;
    if c>0
      then begin write(c);a:=a mod b;end
      else write(0);
  end;
end.Good Luck!
 
|  | Ответ отправил: Николай Рубан (статус: 10-ый класс)Время отправки: 23 декабря 2008, 00:17
 
 |  
 Мини-форум вопросаВсего сообщений: 7; последнее сообщение — 22 декабря 2008, 18:49; участников в обсуждении: 3. 
|   | IlluminatI (статус: 2-ой класс), 21 декабря 2008, 22:11 [#1]:хм, написал, при любом значении алгоритм получает Pi = 0 |  
|   | Николай Рубан (статус: 10-ый класс), 22 декабря 2008, 17:08 [#2]:Что-то ни в одном из приведенных примеров нет ответа! 
 В первом ответе - насколько я понимаю в переменной t хранится точность, но как задать точность скажем в 100 знаков так и не понятно - тип REAL не поддерживает такую точность.
 
 Во втором ответе аналогично..., точность ограничена типом!!!
 
 Так, что НИ одного верного ответа НЕТ!
 Я считаю, что данную задачу нужно решать как-то путем алгебраических преобразований (на подобие длинной арифметики), сам к сожалению пока ответа не нашел...
 |  
|   | IlluminatI (статус: 2-ой класс), 22 декабря 2008, 17:32 [#3]:спс Градов Ю.М., а после 16 знаков значит уже никак не вычсислить? |  
|   | IlluminatI (статус: 2-ой класс), 22 декабря 2008, 17:33 [#4]:во 2 алгоритме число находится, но только до 16 ЗНАКОВ, т.е получается 14 знаков после запятой( |  
|   | Вадим К (статус: Академик), 22 декабря 2008, 18:01 [#5]:попробуйте вместо real использовать Exteded. (вроде правильно написал имя типа) Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Николай Рубан (статус: 10-ый класс), 22 декабря 2008, 18:32 [#6]:To Вадим К: 
 Не совсем верно, букву одну пропустили... - Extended.
 Но все равно данный тип не решает задачи в общем виде...
 |  
|   | Вадим К (статус: Академик), 22 декабря 2008, 18:49 [#7]:Я же так и писал. А в общем - надо искать исходники программы prime - хотя там и на си, но считает и по миллиону Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |