возвращение к программированию
Модератор: Модераторы
-
V.Pozyvnoy
- новенький
- Сообщения: 53
- Зарегистрирован: 14.10.2019 11:30:19
Тут помоему все просто. Можно взять ничтожно малые доли градуса и посчитать длину сегмента окружности которая отсечется. Получатся малые величины. Потом эти малые величины нужно суметь между собой сложить что бы сохранить длинные значения после запятой. Рутинное занятие, арифметика с длинными числами.
Сами пишите что для инженерных расчетов достаточно не очень большая точность и сами предлагаете
Добавлено спустя 4 минуты 27 секунд:
Сейчас проверил, считает при n=10000
результат 3,141592
после запятой с седьмого знака расхождение
Сами пишите что для инженерных расчетов достаточно не очень большая точность и сами предлагаете
Добавлено спустя 4 минуты 27 секунд:
Сейчас проверил, считает при n=10000
результат 3,141592
после запятой с седьмого знака расхождение
V.Pozyvnoy писал(а):Сами пишите что для инженерных расчетов достаточно не очень большая точность и сами предлагаете
Неправильный подход. Перепутана причина и следствие.
Вот смотрите. Расчёт и алгоритм ведь Ваш, правильно? Следовательно цель расчёта Вы определяли себе сами. Точность вычисления значения ПИ Вы тоже заложили сами - Double. Т.е., другими словами, точность должна быть (специально подчёркиваю
V.Pozyvnoy писал(а):после запятой с седьмого знака расхождение
следовательно либо алгоритм, либо тип данных неправильный. Ваша цель - учебная. Следовательно точность должна быть обеспечена для мантиссы того типа данных, который Вы используете в расчётах. Отсюда однозначный вывод - Вы применяете неправильный алгоритм.
Вот если бы Вы численно вычисляли производную - никто бы Вам и полслова не сказал, потому что там из-за алгоритмов, даже самых точных, полмантиссы всегда неточная. Но тут то есть куча точных алгоритмов...
-
V.Pozyvnoy
- новенький
- Сообщения: 53
- Зарегистрирован: 14.10.2019 11:30:19
Алгоритм правильный. Это счет расстояния в координатах Y(x) между точками находящимися на окружности. По точности счета можно работать, совершенствовать, что не изменяет основы.
Добавлено спустя 24 минуты 29 секунд:
Товарищи, давайте пока оставим его в покое. Может быть я увеличу возможности по точности, может быть кто то захочет усовершенствовать.
Добавлено спустя 24 минуты 29 секунд:
Товарищи, давайте пока оставим его в покое. Может быть я увеличу возможности по точности, может быть кто то захочет усовершенствовать.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Для получения 14-15 знаков этим методом нужно n>10^9, что написано во многих учебниках, где вспоминают историю вычислений Пи.
Снег Север писал(а):Для получения 14-15 знаков этим методом нужно n>10^9
Только не с этой программой, здесь ничего не получится.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Vadim, у топикстартера идет накопление погрешностей от двух извлечений корня, ничего удивительного.
-
V.Pozyvnoy
- новенький
- Сообщения: 53
- Зарегистрирован: 14.10.2019 11:30:19
Снег Север ищет заумные вещи. Не нужно усложнять. Человечество не придумало другого способа вычисления расстояний между А(x1,y1) и B(x2,y2) на плоскости x,y
Хотите потренироваться? Возьмите листок бумаги нарисуйте окружность и постройте путь жучка-паучка что бы он сек окружность с двух сторон внешней и внутренней. Счет должен стать точнее.
Я может быть сделаю что то подобное, посмотрю. Сегодня нужно велосипед с магазина забрать. Я купил, а свой отдал. У нас в Краснодаре зимой хорошо если с неделю полежит снег, а так можно всю зиму кататься. Я когда жил в Москве зимой катался в Битцевском парке - красота!
Хотите потренироваться? Возьмите листок бумаги нарисуйте окружность и постройте путь жучка-паучка что бы он сек окружность с двух сторон внешней и внутренней. Счет должен стать точнее.
Я может быть сделаю что то подобное, посмотрю. Сегодня нужно велосипед с магазина забрать. Я купил, а свой отдал. У нас в Краснодаре зимой хорошо если с неделю полежит снег, а так можно всю зиму кататься. Я когда жил в Москве зимой катался в Битцевском парке - красота!
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
V.Pozyvnoy, человечество минимум три четверти века ищет и находит способы вычислений которые экономны и не накапливают погрешности. Над этим работал не один десяток лучших умов человечества.
И следует иметь ввиду , что ломиться в лоб не только в математике, но и в жизни не всегда верно, иногда объездной путь приводит к цели куда быстрее. Для того же Пи вычисление с использованием его иных свойств, а не только как отношения длины окружности к диаметру, оказывается намного более успешным.
И следует иметь ввиду , что ломиться в лоб не только в математике, но и в жизни не всегда верно, иногда объездной путь приводит к цели куда быстрее. Для того же Пи вычисление с использованием его иных свойств, а не только как отношения длины окружности к диаметру, оказывается намного более успешным.
-
V.Pozyvnoy
- новенький
- Сообщения: 53
- Зарегистрирован: 14.10.2019 11:30:19
Я еще раз. Посчитать длину дуги очень малой угловой величины единичной окружности и сложить путем арифметики для длинных чисел. Вполне нормально.
Число ПИ можно представить бесконечным рядом, постоянно бить на одинаковы треугольники и считать катет. Число ПИ можно считать другими способами. Отлично! Я понял.
Число ПИ можно представить бесконечным рядом, постоянно бить на одинаковы треугольники и считать катет. Число ПИ можно считать другими способами. Отлично! Я понял.
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
Круто!
У меня вычисляется за 0,78 сек...
А вообще, с такой установкой битности можно получить 301 029 знаков числа ПИ...
Круто!
У меня вычисляется за 0,78 сек...
А вообще, с такой установкой битности можно получить 301 029 знаков числа ПИ...
Vadim писал(а):А вообще, с такой установкой битности можно получить 301 029 знаков числа ПИ...
Дык с запасом, жадность фраера губит.
iskander
У них там формула есть для расчёта...
У них там формула есть для расчёта...
Вангую, в основе формулы лежит логарифм десяти по основанию два?
Во всяком случае, я считал именно так(с округлением до ближайшего миллиона
).
Во всяком случае, я считал именно так(с округлением до ближайшего миллиона
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;
