возвращение к программированию

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: возвращение к программированию

Сообщение V.Pozyvnoy » 22.11.2019 14:48:29

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

Сами пишите что для инженерных расчетов достаточно не очень большая точность и сами предлагаете

Добавлено спустя 4 минуты 27 секунд:
Сейчас проверил, считает при n=10000
результат 3,141592

после запятой с седьмого знака расхождение
V.Pozyvnoy
новенький
 
Сообщения: 53
Зарегистрирован: 14.10.2019 12:30:19

Re: возвращение к программированию

Сообщение Vadim » 22.11.2019 15:17:21

V.Pozyvnoy писал(а):Сами пишите что для инженерных расчетов достаточно не очень большая точность и сами предлагаете

Неправильный подход. Перепутана причина и следствие. ;-)
Вот смотрите. Расчёт и алгоритм ведь Ваш, правильно? Следовательно цель расчёта Вы определяли себе сами. Точность вычисления значения ПИ Вы тоже заложили сами - Double. Т.е., другими словами, точность должна быть (специально подчёркиваю ;-) ) в мантиссе или 14 или 15 знаков. Последний знак, по определению, всегда неточный, потому что округляется. А у Вас:
V.Pozyvnoy писал(а):после запятой с седьмого знака расхождение

следовательно либо алгоритм, либо тип данных неправильный. Ваша цель - учебная. Следовательно точность должна быть обеспечена для мантиссы того типа данных, который Вы используете в расчётах. Отсюда однозначный вывод - Вы применяете неправильный алгоритм. ;-)

Вот если бы Вы численно вычисляли производную - никто бы Вам и полслова не сказал, потому что там из-за алгоритмов, даже самых точных, полмантиссы всегда неточная. Но тут то есть куча точных алгоритмов...
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: возвращение к программированию

Сообщение V.Pozyvnoy » 22.11.2019 15:30:17

Алгоритм правильный. Это счет расстояния в координатах Y(x) между точками находящимися на окружности. По точности счета можно работать, совершенствовать, что не изменяет основы.

Добавлено спустя 24 минуты 29 секунд:
Товарищи, давайте пока оставим его в покое. Может быть я увеличу возможности по точности, может быть кто то захочет усовершенствовать.
V.Pozyvnoy
новенький
 
Сообщения: 53
Зарегистрирован: 14.10.2019 12:30:19

Re: возвращение к программированию

Сообщение Снег Север » 23.11.2019 06:34:27

Для получения 14-15 знаков этим методом нужно n>10^9, что написано во многих учебниках, где вспоминают историю вычислений Пи.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: возвращение к программированию

Сообщение Vadim » 23.11.2019 09:31:36

Снег Север писал(а):Для получения 14-15 знаков этим методом нужно n>10^9

Только не с этой программой, здесь ничего не получится. :) Максимальную точность она даёт на цикле с 1000000 итерациями - 10 знаков мантиссы. Если делать итераций больше - начинаются непередаваемые словами печали, точность не только не улучшается, а даже ещё и ухудшается. Либо что-то не то с алгоритмом, либо одно из двух... :D Поскольку я не математик, а всего лишь ИТ-сантехник, что-то мне в голову по этому поводу ничего не приходит...
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: возвращение к программированию

Сообщение Снег Север » 23.11.2019 11:17:50

Vadim, у топикстартера идет накопление погрешностей от двух извлечений корня, ничего удивительного.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: возвращение к программированию

Сообщение V.Pozyvnoy » 23.11.2019 12:18:32

Снег Север ищет заумные вещи. Не нужно усложнять. Человечество не придумало другого способа вычисления расстояний между А(x1,y1) и B(x2,y2) на плоскости x,y
Хотите потренироваться? Возьмите листок бумаги нарисуйте окружность и постройте путь жучка-паучка что бы он сек окружность с двух сторон внешней и внутренней. Счет должен стать точнее.

Я может быть сделаю что то подобное, посмотрю. Сегодня нужно велосипед с магазина забрать. Я купил, а свой отдал. У нас в Краснодаре зимой хорошо если с неделю полежит снег, а так можно всю зиму кататься. Я когда жил в Москве зимой катался в Битцевском парке - красота!
V.Pozyvnoy
новенький
 
Сообщения: 53
Зарегистрирован: 14.10.2019 12:30:19

Re: возвращение к программированию

Сообщение Снег Север » 23.11.2019 15:27:39

V.Pozyvnoy, человечество минимум три четверти века ищет и находит способы вычислений которые экономны и не накапливают погрешности. Над этим работал не один десяток лучших умов человечества.
И следует иметь ввиду , что ломиться в лоб не только в математике, но и в жизни не всегда верно, иногда объездной путь приводит к цели куда быстрее. Для того же Пи вычисление с использованием его иных свойств, а не только как отношения длины окружности к диаметру, оказывается намного более успешным.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: возвращение к программированию

Сообщение V.Pozyvnoy » 23.11.2019 16:40:00

Я еще раз. Посчитать длину дуги очень малой угловой величины единичной окружности и сложить путем арифметики для длинных чисел. Вполне нормально.

Число ПИ можно представить бесконечным рядом, постоянно бить на одинаковы треугольники и считать катет. Число ПИ можно считать другими способами. Отлично! Я понял. :roll:
V.Pozyvnoy
новенький
 
Сообщения: 53
Зарегистрирован: 14.10.2019 12:30:19

Re: возвращение к программированию

Сообщение iskander » 23.11.2019 21:41:44

V.Pozyvnoy писал(а):Число ПИ можно считать другими способами. Отлично! Я понял.

Вот, возможно будет интересно, вычисляет более 200000 десятичных знаков Пи примерно за секунду на моей старенькой машине:
Код: Выделить всё
program pidigits;

{$mode objfpc}{$H+}{$coperators on}

uses
  SysUtils, DateUtils, gmp;

procedure AGM(a0, b0: MPFloat; out an, bn: MPFloat);
begin
  an := (a0 + b0)/2;
  bn := a0 * b0;
  bn := f_sqrt(bn);
end;

procedure PrintPi;
var
  a0, b0, an, bn, tn, v: MPFloat;
  I: Integer;
  n: Integer = 1;
  Pi: string;
begin
  a0 := 1;
  b0 := 0.5;
  b0 := f_sqrt(b0);
  tn := 0.25;
  for I := 1 to 9 do
    begin
      AGM(a0, b0, an, bn);
      v := an - a0;
      tn -= v * v * n;
      n += n;
      AGM(an, bn, a0, b0);
      v := a0 - an;
      tn -= v * v * n;
      n += n;
    end;
  a0 *= a0;
  a0 /= tn;
  Pi := a0;

  WriteLn('Total calculated Pi digits: ', n);
  SetLength(Pi, n + 1);
  WriteLn(Pi);
  WriteLn;
  SetLength(Pi, 100001);
  WriteLn('Pi truncated to ', Length(Pi) - 1, ' digits = ' );
  WriteLn(Pi);
end;

var
  StartTime: TTime;

begin
  f_set_default_prec(1000000);
  StartTime := Time;
  PrintPi;
  WriteLn('Time elapsed: ', MillisecondsBetween(Time, StartTime)/1000 : 0 : 4, 's.');
end.

Второй раз печатает обрезанное до 100000 знаков значение, чтобы можно было сравнить с табличным.
Требует наличия библиотеки GMP.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: возвращение к программированию

Сообщение Vadim » 24.11.2019 07:25:13

iskander
Круто! :D
У меня вычисляется за 0,78 сек...
А вообще, с такой установкой битности можно получить 301 029 знаков числа ПИ... ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: возвращение к программированию

Сообщение iskander » 24.11.2019 09:19:03

Vadim писал(а):А вообще, с такой установкой битности можно получить 301 029 знаков числа ПИ...

Дык с запасом, жадность фраера губит. :)
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: возвращение к программированию

Сообщение Vadim » 24.11.2019 11:17:10

iskander
У них там формула есть для расчёта... ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: возвращение к программированию

Сообщение iskander » 24.11.2019 11:42:06

Вангую, в основе формулы лежит логарифм десяти по основанию два?
Во всяком случае, я считал именно так(с округлением до ближайшего миллиона :) ).
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: возвращение к программированию

Сообщение Vadim » 25.11.2019 09:36:35

iskander
Ага... :)
Я сделал две функции - пересчёт кол-ва бит в кол-во цифр и наоборот цифр в биты:
Код: Выделить всё
function GetDigits(prec: LongWord): longWord;
begin
  result := Trunc(prec * LOG_10_2);
end;

function GetPrec(digits: LongWord): valuint;
Var
  ost: LongWord;
  bpl: LongWord;
begin
  result:=Trunc(digits/LOG_10_2)+1;
  bpl:=bits_per_limb();
  ost:=result mod bpl;
  result:=result + bpl - ost;
end;
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24

Рейтинг@Mail.ru