powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Число ПИ
25 сообщений из 88, страница 1 из 4
Число ПИ
    #38517462
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
/*  
    This program implements the BBP algorithm to generate a few hexadecimal
    digits beginning immediately after a given position id, or in other words
    beginning at position id + 1.  On most systems using IEEE 64-bit floating-
    point arithmetic, this code works correctly so long as d is less than
    approximately 1.18 x 10^7.  If 80-bit arithmetic can be employed, this limit
    is significantly higher.  Whatever arithmetic is used, results for a given
    position id can be checked by repeating with id-1 or id+1, and verifying 
    that the hex digits perfectly overlap with an offset of one, except possibly
    for a few trailing digits.  The resulting fractions are typically accurate 
    to at least 11 decimal digits, and to at least 9 hex digits.  
*/

/*  David H. Bailey     2006-09-08 */

#include <stdio.h>
#include <math.h>

int main()
{
  double pid, s1, s2, s3, s4;
  double series (int m, int n);
  void ihex (double x, int m, char c[]);
  int id = 1000000;
#define NHX 16
  char chx[NHX];

/*  id is the digit position.  Digits generated follow immediately after id. */

  s1 = series (1, id);
  s2 = series (4, id);
  s3 = series (5, id);
  s4 = series (6, id);
  pid = 4. * s1 - 2. * s2 - s3 - s4;
  pid = pid - (int) pid + 1.;
  ihex (pid, NHX, chx);
  printf (" position = %i\n fraction = %.15f \n hex digits =  %10.10s\n",
  id, pid, chx);
}

void ihex (double x, int nhx, char chx[])

/*  This returns, in chx, the first nhx hex digits of the fraction of x. */

{
  int i;
  double y;
  char hx[] = "0123456789ABCDEF";

  y = fabs (x);

  for (i = 0; i < nhx; i++){
    y = 16. * (y - floor (y));
    chx[i] = hx[(int) y];
  }
}

double series (int m, int id)

/*  This routine evaluates the series  sum_k 16^(id-k)/(8*k+m) 
    using the modular exponentiation technique. */

{
  int k;
  double ak, eps, p, s, t;
  double expm (double x, double y);
#define eps 1e-17

  s = 0.;

/*  Sum the series up to id. */

  for (k = 0; k < id; k++){
    ak = 8 * k + m;
    p = id - k;
    t = expm (p, ak);
    s = s + t / ak;
    s = s - (int) s;
  }

/*  Compute a few terms where k >= id. */

  for (k = id; k <= id + 100; k++){
    ak = 8 * k + m;
    t = pow (16., (double) (id - k)) / ak;
    if (t < eps) break;
    s = s + t;
    s = s - (int) s;
  }
  return s;
}

double expm (double p, double ak)

/*  expm = 16^p mod ak.  This routine uses the left-to-right binary 
    exponentiation scheme. */

{
  int i, j;
  double p1, pt, r;
#define ntp 25
  static double tp[ntp];
  static int tp1 = 0;

/*  If this is the first call to expm, fill the power of two table tp. */

  if (tp1 == 0) {
    tp1 = 1;
    tp[0] = 1.;

    for (i = 1; i < ntp; i++) tp[i] = 2. * tp[i-1];
  }

  if (ak == 1.) return 0.;

/*  Find the greatest power of two less than or equal to p. */

  for (i = 0; i < ntp; i++) if (tp[i] > p) break;

  pt = tp[i-1];
  p1 = p;
  r = 1.;

/*  Perform binary exponentiation algorithm modulo ak. */

  for (j = 1; j <= i; j++){
    if (p1 >= pt){
      r = 16. * r;
      r = r - (int) (r / ak) * ak;
      p1 = p1 - pt;
    }
    pt = 0.5 * pt;
    if (pt >= 1.){
      r = r * r;
      r = r - (int) (r / ak) * ak;
    }
  }

  return r;
}
...
Рейтинг: 0 / 0
Число ПИ
    #38517465
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в с# реализован алгоритм формулы Бэйли — Боруэйна — Плаффа, объясните можно ли его перепмсать в VBA?
...
Рейтинг: 0 / 0
Число ПИ
    #38517467
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что делают вот эти две строчки?

#include <stdio.h>
#include <math.h>
...
Рейтинг: 0 / 0
Число ПИ
    #38517472
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пытался перегнать её с помощью конвертера, не получилось :(
...
Рейтинг: 0 / 0
Число ПИ
    #38517485
Диклевич Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому что это ни разу не C#, а C++.
...
Рейтинг: 0 / 0
Число ПИ
    #38517521
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volodbkaможно ли его перепмсать в VBA?
Можно, переписывай.
Volodbkaпытался перегнать её с помощью конвертера, не получилось :(
И не получится =)
Ручками, ручками... причём желательно сначала разобраться в запрограммированном тут алгоритме.
...
Рейтинг: 0 / 0
Число ПИ
    #38517531
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volodbka,

Модератор: Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
Число ПИ
    #38517642
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Число ПИ
    #38517645
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Число ПИ
    #38517647
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Реферат
...
Рейтинг: 0 / 0
Число ПИ
    #38517650
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И что нам с этим всем делать?
...
Рейтинг: 0 / 0
Число ПИ
    #38517655
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1 Надо научиться работать со строковыми числами.
2 Надо уметь считать 16 разрядные числа.
3 Разобраться в выше изложенном коде и адаптировать под VBA.
А так больше ничего.
...
Рейтинг: 0 / 0
Число ПИ
    #38517657
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volodbka1 НадоVolodbka2 НадоКому надо?

3. В общем, можно не особо разбираться в алгоритме, а просто переписать операторы на VB - ничего сверхъестественного там не наблюдается. For - он и в VB For, If он и в VB If - просто немного другой синтаксис. Если не выдаст правильный результат сходу - тогда уже кумекать. А так - справочник по синтаксису С++ и вперед.
...
Рейтинг: 0 / 0
Число ПИ
    #38517683
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volodbkaчто делают вот эти две строчки?

#include <stdio.h>
#include <math.h>

Подключают две библиотеки, имена которых заключены в угловые скобки. Примерно тоже самое, что и установка ссылок на библиотеки в проектах VBA.
...
Рейтинг: 0 / 0
Число ПИ
    #38517684
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnVolodbkaчто делают вот эти две строчки?
#include <stdio.h>
#include <math.h>Подключают две библиотеки, имена которых заключены в угловые скобки. Примерно тоже самое, что и установка ссылок на библиотеки в проектах VBA.stdio = Standard Input-Output, math - математический модуль.
...
Рейтинг: 0 / 0
Число ПИ
    #38517685
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор кода на секундочку удостоен пространной статьи в википедии

http://en.wikipedia.org/wiki/David_H._Bailey
...
Рейтинг: 0 / 0
Число ПИ
    #38517689
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один из выводов, который был сделан Дэвидом Бейли и его соавторами, и благодаря которому он в частности стал известен, это то, что начиная с некоторой десятичной позиции, во многих числовых константах, включая и число пи, цифры могут, вообще говоря, быть случайными, т.е. в определенном смысле получать разные значения.
...
Рейтинг: 0 / 0
Число ПИ
    #38517693
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напомнило известную теорему Римана, постулирующую тот факт, что от перестановки мест слагаемых сумма, вообще говоря, меняется. Причем для любого наперед заданного числа и бесконечности всегда найдется такая перестановка слагаемых, которая дает в сумме это наперед заданное значение (при условии бесконечности числа слагаемых и их знакопеременности).
...
Рейтинг: 0 / 0
Число ПИ
    #38517764
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем плохо.
Что-то непонятное со шрифтами.
Я полагаю что тут следующие функции:
- main();
- ihex();
- series();
- expm ().
Пока буду разбираться с функцией expm.
...
Рейтинг: 0 / 0
Число ПИ
    #38517766
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VolodbkaЧто-то непонятное со шрифтами.
браузер при посте шалит с шрифтами в юникоде. попробуй переключиться на русский перед вставкой из буфера или попробуй другой браузер (тренируйся с предварительным просмотром)
...
Рейтинг: 0 / 0
Число ПИ
    #38517768
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
Option Explicit

' Эта программа реализует алгоритм BBP генерировать несколько
' шестнадцатеричных цифр, начиная сразу после заданной позиции ID,
' или, другими словами, начиная с позиции ID + 1. На большинстве систем,
' использующих 64-разрядную арифметику IEEE с плавающей запятой,
' этот код работает правильно, пока г меньше примерно 1,18 х 10 ^ 7.
' Если 80-битный арифметическое могут быть использованы,
' этот предел значительно выше. Независимо арифметика используется,
' результаты для данной позиции ID можно проверить путем повторения с ID-1 или ID 1,
' и проверки, что шестнадцатеричные цифры прекрасно перекрывают со смещением одного,
' за исключением, возможно в течение нескольких хвостовых цифр. Полученные фракции,
' как правило, с точностью не менее 11 десятичных цифр, и, по крайней мере 9 шестнадцатеричных цифр.


Private Function main() As Integer

Dim pid$, s1$, s2$, s3$, s4$
Dim series$(m%, n%)
Dim id%
'void ihex(x%, m%, char c())
id% = 1000000
'$define NHX 16
' char chx[NHX];
'идентификатор цифра положение. Цифры генерируется следовать сразу после идентификатором.

 s1$ = series$(1, id%)
 s2$ = series$(4, id%)
 s3$ = series$(5, id%)
 s4$ = series$(6, id%)
' pid$ = 4$ * s1$ - 2$ * s2$ - s3$ - s4$
' pid$ = pid$ - pid$ + 1$
 'ihex (pid, NHX, chx);
 'printf (" position = %i\n fraction = %.15f \n hex digits = %10.10s\n",
 'id, pid, chx);

End Function

Function ihex(x$, nhx%, ByRef chx As String)
Dim i%
Dim y$
Dim hx$
hx = "0123456789ABCDEF"
y = Abs(x)
For i% = 0 To nhx - 1
'y = 16$ * (y - Floor(y))
End Function

Function series$(m%, id%)
'Эта процедура оценивает сериала sum_k 16 ^ (ID-K) / (8 * K + M)
'используя модульную технику возведения в степень.
'{
 Dim k%
 Dim ak$
 Dim eps$
 Dim p$
 Dim s$
 Dim t$
 Dim expm$(x$, y$)
 Dim eps$
 
 eps$ = 1E-17
 s$ = 0

'Просуммировать ряд до идентификатором
 
 For k% = 0 To id% Step 1
 ak$ = 8 * k% + m
 p$ = id% - k%
 t$ = expm(p$, ak$)
 s$ = s$ + t$ / ak$
 s$ = s$ - Int(s$)
 Next k%

'Вычислить несколько терминов, где к> = ID.

 For k = id To id + 100 Step 1
    ak$ = 8 * k% + m
    't = pow (16., (double) (id - k)) / ak;
    If t < eps Then Exit For
        s = s + t
        s = s - Int(s)
 Next k
 
 series$() = s

End Function

Public Function expm$(ByVal p$, ByVal ak$)

    'expm = 16 ^ р мод ак. Эта процедура использует бинарный схему
    'возведения в степень слева-направо.

    Dim i%
    Dim j%
    Dim p1$
    Dim pt$
    Dim r$
    Dim ntp%
    
    Dim tp$(25)
    Dim tp1%
    
    tp1% = 0
    ntp% = 25
    
'Если это первый вызов expm, заполнить мощь двух таблицы тп.
    If tp1% = 0 Then
        tp1% = 1
        tp$(0) = 1

            For i% = 1 To ntp% Step 1
            tp$(i%) = 2 * tp$(i% - 1)
            Next i%
    End If

 If ak$ = "1" Then expm$ = "0"

'Найти наибольшую степень двойки меньше или равен р.
    For i% = 0 To ntp Step 1
        If tp(i%) > p Then Exit For
            pt$ = tp$(i% - 1)
            p1$ = p$
            r$ = 1
    Next i%

'Выполните бинарный алгоритм возведения в степень по модулю ак.
     For j% = 1 To i% Step 1
        If p1$ >= pt$ Then
          r$ = 16 * r$
           r$ = r$ - Int((r$ / ak$) * ak$)
            p1$ = p1$ - pt$
        End If
 
    pt$ = 0.5 * pt$
  
        If pt$ >= 1 Then
            r$ = r$ * r$
            r$ = r$ - Int((r$ / ak$) * ak$)
        End If
    Next j%

    expm$ = r$

End Function
...
Рейтинг: 0 / 0
Число ПИ
    #38517782
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему ты сделал числовые переменные текстовыми?
Это чревато многочисленными неявными преобразованиями при числовых операциях, а также ошибками, например "3"+"5" будет равно "35"
...
Рейтинг: 0 / 0
Число ПИ
    #38517786
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как это работает?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub CommandButton1_Click()
         
      Dim n As Long, v As Double
      For n = 1 To 10001 Step 4 'For n = 1 To 100000001 Step 4
        v = v + 4 / n - 4 / (n + 2)
      Next n
      Cells(1, 1) = v
End Sub
...
Рейтинг: 0 / 0
Число ПИ
    #38517801
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хорошо подправлю на # - ки
...
Рейтинг: 0 / 0
Число ПИ
    #38517822
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VolodbkaА как это работает?итерационно и довольно быстро.

вопрос неясен.
...
Рейтинг: 0 / 0
25 сообщений из 88, страница 1 из 4
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Число ПИ
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]