Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 221

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
У меня вопрос: как можно самостоятельно вычислить число Pi до N знаков после запятой?)
Заранее спасибо!

IlluminatI Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: IlluminatI (статус: 2-ой класс)
Вопрос отправлен: 21 декабря 2008, 19:45
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: Ученый

Здравствуйте, IlluminatI! Пошарился и нашел вот такой примерчик (в приложении):

Приложение:
  1.  
  2.  
  3. unit pi_;
  4.  
  5. interface
  6.  
  7. uses
  8. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  9. StdCtrls;
  10.  
  11. type
  12. TForm1 = class(TForm)
  13.  
  14.  
  15. Label1: TLabel;
  16.  
  17. procedure Button1Click(Sender: TObject);
  18. private
  19. { Private declarations }
  20. public
  21. { Public declarations }
  22. end;
  23.  
  24. var
  25. Form1: TForm1;
  26.  
  27. implementation
  28.  
  29. {$R *.DFM}
  30.  
  31. procedure TForm1.Button1Click(Sender: TObject);
  32.  
  33. var
  34.  
  35.  
  36.  
  37.  
  38.  
  39. begin
  40. pi:=0;
  41. n:=1;
  42. t:=StrToFloat(edit1.text);
  43.  
  44. while elem >= t do
  45. begin
  46. elem:=1/(2*n-1);
  47. if n MOD 2 = 0
  48. then pi:=pi-elem
  49. else pi:=pi+elem;
  50. n:=n+1;
  51. end;
  52. pi:=pi*4;
  53.  
  54.  
  55. end;
  56.  
  57. 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

IlluminatI (статус: 2-ой класс), 21 декабря 2008, 22:11 [#1]:

хм, написал, при любом значении алгоритм получает Pi = 0
Николай Рубан

Николай Рубан (статус: 10-ый класс), 22 декабря 2008, 17:08 [#2]:

Что-то ни в одном из приведенных примеров нет ответа!

В первом ответе - насколько я понимаю в переменной t хранится точность, но как задать точность скажем в 100 знаков так и не понятно - тип REAL не поддерживает такую точность.

Во втором ответе аналогично..., точность ограничена типом!!!

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

IlluminatI (статус: 2-ой класс), 22 декабря 2008, 17:32 [#3]:

спс Градов Ю.М., а после 16 знаков значит уже никак не вычсислить?
IlluminatI

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 - хотя там и на си, но считает и по миллиону
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:40
Выполнено за 0.03 сек.