powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Число ПИ
88 сообщений из 88, показаны все 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
Число ПИ
    #38517823
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volodbka,

Здесь у тебя проблема:

Код: vbnet
1.
2.
3.
For i% = 0 To nhx - 1
'y = 16$ * (y - Floor(y))
End Function
...
Рейтинг: 0 / 0
Число ПИ
    #38517824
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И нотация с %, $ и т.п. уже наверно лет десять как не используется...
...
Рейтинг: 0 / 0
Число ПИ
    #38517828
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnИ нотация с %, $ и т.п. уже наверно лет десять как не используется...не используется - ведь не значит, что не поддерживается, пусть делает так, если хочет
...
Рейтинг: 0 / 0
Число ПИ
    #38517845
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

я спутал решетки с долларами и хотел показать на примере что они работают
...
Рейтинг: 0 / 0
Число ПИ
    #38517848
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConn,

я пытаюсь разобраться с функцией expm (), это видимо какой-то алгоритм быстрого возведения в степень, причем слева на право, как с ним разберусь, буду смотреть другие функции.
Предполагаю запускать каждую функцию в excel по отдельности, а потом постараюсь воссоединить их в целое по смыслу.
...
Рейтинг: 0 / 0
Число ПИ
    #38517853
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.
Option Explicit

    Public Function expm(ByVal p As Double, ByVal ak As Double)
    'expm = 16 ^ р мод ak. Эта процедура использует бинарную схему
    'возведения в степень слева-направо.

    Dim i As Integer
    Dim j As Integer
    Dim p1 As Double
    Dim pt As Double
    Dim r As Double
    Dim ntp As Integer
    
    Static tp(25) As Double
    Static tp1 As Integer
    
    tp1% = 0
    ntp% = 25
    
    'Если это первый вызов expm, то заполнить массив tp.
    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
Число ПИ
    #38517863
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для сравнения исходный код в C++
Код: 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.
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
Число ПИ
    #38517865
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очевидно, неправильно адаптирован фрагмент
Код: plaintext
1.
2.
3.
4.
5.
  for (i = 0; i < ntp; i++) if (tp[i] > p) break;

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

три последние оператора в оригинале в цикл не входят, а у тебя входят.

да, объявление static там не зря - иначе комментарий "'Если это первый вызов expm, то заполнить массив tp." бессмысленнен - вызов всегда будет считаться первым
...
Рейтинг: 0 / 0
Число ПИ
    #38517872
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и еще, если я ничего не путаю, конструкция
Код: plaintext
1.
for (i = 0; i < ntp; i++)

проходит цикл от 0 до ntp-1, а у тебя цикл идет от 0 до ntp
...
Рейтинг: 0 / 0
Число ПИ
    #38517891
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volodbka,

Если ты отдекларировал переменную таким образом:
Код: vbnet
1.
Static tp1 As Integer

, то нет нужды в записи
Код: vbnet
1.
tp1% = 0

. Достаточно
Код: vbnet
1.
tp1 = 0

. Это касается всех переменных.
...
Рейтинг: 0 / 0
Число ПИ
    #38517989
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volodbka,

Мне кажется, что это условие будет исполняться всегда....

:)

Код: vbnet
1.
2.
3.
4.
5.
    tp1% = 0
    ntp% = 25
    
    'Если это первый вызов expm, то заполнить массив tp.
    If tp1 = 0 Then
...
Рейтинг: 0 / 0
Число ПИ
    #38517991
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnМне кажется, что это условие будет исполняться всегда....ну да, надо ее объявить как static, а инициализацию убрать.
...
Рейтинг: 0 / 0
Число ПИ
    #38517992
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volodbka,

Мне кажется, что в исходном коде эта строка:
Код: plaintext
1.
static int tp1 = 0;


скорее всего эквивалентна этой строке на VB:
Код: vbnet
1.
Static tp1 As Integer


Поэтому существование этой строки в твоем коде
Код: vbnet
1.
tp1% = 0


а) Излишне
б) Разрушительно
...
Рейтинг: 0 / 0
Число ПИ
    #38518076
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VolodbkaДля сравнения исходный код в C++
Код: 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.
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;
}



Код: 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.
Option Explicit

    Public Function expm(ByVal p As Double, ByVal ak As Double)
    'expm = 16 ^ р мод ak. Эта процедура использует бинарную схему
    'возведения в степень слева-направо.

    Dim i As Integer
    Dim j As Integer
    Dim p1 As Double
    Dim pt As Double
    Dim r As Double
    Dim ntp As Integer
    
    Static tp(25) As Double
    Static tp1 As Integer
    
    ntp = 25
    
    'Если это первый вызов expm, то заполнить массив tp.
    If tp1 <> 1 Then
        tp1 = 1
        tp(0) = 1

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

    If ak = 1 Then expm = 0

    'Найти наибольшую степень двойки меньше или равной р.
        For i = 0 To ntp - 1 Step 1
            If tp(i) > p Then Exit For
        Next i
            
            pt = tp(i - 1)
            p1 = p
            r = 1
    
    'Выполняет бинарный алгоритм возведения в степень по модулю ак.
    For j = 1 To i - 1 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
Число ПИ
    #38518083
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volodbka,

ты хоть пиши пояснение какое-то, а то код опубликовал, а дальше-то что? работает? ошибку выдает? неправильно считает?
...
Рейтинг: 0 / 0
Число ПИ
    #38518093
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.
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;
}



стало в VBA
Код: 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.
 Function series(m As Integer, id As Integer)
    'Эта процедура оценивает серию sum_k 16 ^ (ID-K) / (8 * K + M)
    'используя модульную технику возведения в степень.
    Dim k As Integer
    Dim ak As Double
    Dim eps As Double
    Dim p As Double
    Dim s As Double
    Dim t As Double
    Dim expm(x, y) As Double
    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;
            t = 16 * (id - k) / ak
            
        If t < eps Then Exit For
        
            s = s + t
            s = s - Int(s)
    Next k
 
    series = s

    End Function
...
Рейтинг: 0 / 0
Число ПИ
    #38518097
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция expm() что-то считает, её в сторону, надо следующую функцию лепить series()

В series() непонятно: t = pow (16., (double) (id - k)) / ak
...
Рейтинг: 0 / 0
Число ПИ
    #38518103
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pow - это возведение в степень, тут просто - "^" надо поставить,
а вот с этим как быть #define eps 1e-17?
...
Рейтинг: 0 / 0
Число ПИ
    #38518105
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если не ошибаюсь
Const eps As Double = 1E-17
...
Рейтинг: 0 / 0
Число ПИ
    #38518110
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.
    Function series(m As Integer, id As Integer)
    'Эта процедура оценивает серию sum_k 16 ^ (ID-K) / (8 * K + M)
    'используя модульную технику возведения в степень.
    Dim k As Integer
    Dim ak As Double
    Dim eps As Double
    Dim p As Double
    Dim s As Double
    Dim t As Double
    Dim expm(x, y) As Double
    Const eps As Double = 1E-17

    s = 0

    'Суммирует ряд до идентификатора
 
    For k = 0 To id - 1 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 - 1 + 100 Step 1
            ak = 8 * k + m
            
           't = pow (16., (double) (id - k)) / ak;
            t = 16 ^ ((id - k)) / ak
            
        If t < eps Then Exit For
        
            s = s + t
            s = s - Int(s)
    Next k
 
    series = s

    End Function
...
Рейтинг: 0 / 0
Число ПИ
    #38518118
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока вот! Функция series тоже что-то считает, осталось еще две функции там будет жарко

Код: 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.
Option Explicit

Public Const eps As Double = 1E-17

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

    'Суммирует ряд до идентификатора
 
    For k = 0 To id - 1 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 - 1 + 100 Step 1
            ak = 8 * k + m
            
           't = pow (16., (double) (id - k)) / ak;
            t = 16 ^ ((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 As Double, ByVal ak As Double)
    'expm = 16 ^ р мод ak. Эта процедура использует бинарную схему
    'возведения в степень слева-направо.

    Dim i As Integer
    Dim j As Integer
    Dim p1 As Double
    Dim pt As Double
    Dim r As Double
    Dim ntp As Integer
    
    Static tp(25) As Double
    Static tp1 As Integer
    
    ntp = 25
    
    'Если это первый вызов expm, то заполнить массив tp.
    If tp1 <> 1 Then
        tp1 = 1
        tp(0) = 1

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

    If ak = 1 Then expm = 0

    'Найти наибольшую степень двойки меньше или равной р.
        For i = 0 To ntp - 1 Step 1
            If tp(i) > p Then Exit For
        Next i
            
            pt = tp(i - 1)
            p1 = p
            r = 1
    
    'Выполняет бинарный алгоритм возведения в степень по модулю ак.
    For j = 1 To i - 1 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
Число ПИ
    #38518129
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот следующий кролик
Было в С++

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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];
  }
}



Стало в VBA

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  Function ihex(x As Double, nhx As Integer, ByRef chx As String)
    Dim i As Integer
    Dim y As Double
    Dim hx As Double
        hx = "0123456789ABCDEF"
    
        y = Abs(x)
    
    For i = 0 To nhx - 1
        'y = 16# * (y - Floor(y))
        'chx(i) = hx(int( y))
    Next nhx
    
    End Function
...
Рейтинг: 0 / 0
Число ПИ
    #38518130
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volodbka,

Если получится, ты будешь первый, кто опубликует алгоритм BBP для числа пи, исполненный на VB.
...
Рейтинг: 0 / 0
Число ПИ
    #38518132
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только зачем присваивать строку числовой переменной...
...
Рейтинг: 0 / 0
Число ПИ
    #38518141
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Следует переписать
Код: plaintext
1.
char hx[] = "0123456789ABCDEF";


как
Код: vbnet
1.
2.
Dim hx() As String * 1
hx = Array("0", "1", "2"....)
...
Рейтинг: 0 / 0
Число ПИ
    #38518155
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Было в C++
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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];
  }
}



стало в VBA
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
   Function ihex(x As Double, nhx As Integer, ByRef chx As String)
    
    'Возвращает, в СНХ, первые NHX шестигранные цифры фракции х.
    
    Dim i As Integer
    Dim y As Double
    Dim hx As Double
        
        hx = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F")
    
        y = Abs(x)
    
    For i = 0 To nhx - 1
        y = 16 * (y - Int(y))
        chx(i) = hx(Int(y))
    Next nhx
    
    End Function
...
Рейтинг: 0 / 0
Число ПИ
    #38518157
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то мне подсказывает что здесь всегда будет 0, y = 16 * (y - Int(y))
...
Рейтинг: 0 / 0
Число ПИ
    #38518160
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volodbka,

Почему?

Единственное, не помешало бы 16 сделать Double, а то все выражение может превратиться в целое

Шестигранные цифры!
...
Рейтинг: 0 / 0
Число ПИ
    #38518162
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnТолько зачем присваивать строку числовой переменной...
А в исходном С++ вроде меняется
...
Рейтинг: 0 / 0
Число ПИ
    #38518179
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VolodbkaVladConnТолько зачем присваивать строку числовой переменной...
А в исходном С++ вроде меняется

В исходнике такого присваивания нет.
...
Рейтинг: 0 / 0
Число ПИ
    #38518180
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volodbkaчто-то мне подсказывает что здесь всегда будет 0, y = 16 * (y - Int(y))

Здесь "y" всегда double, a Int(y) всегда integer. Разница между ними этого не позволит.
...
Рейтинг: 0 / 0
Число ПИ
    #38518185
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
Dim y As Double
y = 3.45
y = 16 * (y - Int(y))
Debug.Print y



результат 7.2
...
Рейтинг: 0 / 0
Число ПИ
    #38518187
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConn,
ок, а какой тип присвоить chx - integer?
...
Рейтинг: 0 / 0
Число ПИ
    #38518188
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConna Int(y) всегда integerк тому же, ты не прав:
Код: vbnet
1.
2.
?typename(int(4.56))
Double
...
Рейтинг: 0 / 0
Число ПИ
    #38518189
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VolodbkaVladConn,
ок, а какой тип присвоить chx - integer?зачем?? там же строка
...
Рейтинг: 0 / 0
Число ПИ
    #38518192
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volodbka, VladConn

Вы друг друга не поняли и говорите про разные переменные
VladConn про hx, а Volodbka про chx
...
Рейтинг: 0 / 0
Число ПИ
    #38518198
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.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
Option Explicit

Public Const eps As Double = 1E-17
Public Const NHX  As Double = 16

' Эта программа реализует алгоритм 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 As Double
    Dim s1 As Double
    Dim s2 As Double
    Dim s3 As Double
    Dim s4 As Double
    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
  
    Public Function ihex(ByVal x As Double, ByVal NHX As Integer, ByRef chx)
    
    'Возвращает, в СНХ, первые NHX шестигранные цифры фракции х.
    
    Dim i As Integer
    Dim y As Double
    Dim hx
        
        hx = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F")
    
        y = Abs(x)
    
    For i = 0 To NHX - 1
        y = 16 * (y - Int(y))
        chx(i) = hx(Int(y))
    Next NHX
    
    End Function

    
    
    Public Function series(ByVal m As Integer, ByVal id As Integer)
    'Эта процедура оценивает серию sum_k 16 ^ (ID-K) / (8 * K + M)
    'используя модульную технику возведения в степень.
    Dim k As Integer
    Dim ak As Double
    Dim eps As Double
    Dim p As Double
    Dim s As Double
    Dim t As Double
    
    s = 0

    'Суммирует ряд до идентификатора
 
    For k = 0 To id - 1 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 - 1 + 100 Step 1
            ak = 8 * k + m
            
           't = pow (16., (double) (id - k)) / ak;
            t = 16 ^ ((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 As Double, ByVal ak As Double)
    'expm = 16 ^ р мод ak. Эта процедура использует бинарную схему
    'возведения в степень слева-направо.

    Dim i As Integer
    Dim j As Integer
    Dim p1 As Double
    Dim pt As Double
    Dim r As Double
    Dim ntp As Integer
    
    Static tp(25) As Double
    Static tp1 As Integer
    
    ntp = 25
    
    'Если это первый вызов expm, то заполнить массив tp.
    If tp1 <> 1 Then
        tp1 = 1
        tp(0) = 1

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

    If ak = 1 Then expm = 0

    'Найти наибольшую степень двойки меньше или равной р.
        For i = 0 To ntp - 1 Step 1
            If tp(i) > p Then Exit For
        Next i
            
            pt = tp(i - 1)
            p1 = p
            r = 1
    
    'Выполняет бинарный алгоритм возведения в степень по модулю ак.
    For j = 1 To i - 1 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
Число ПИ
    #38518199
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProVladConna Int(y) всегда integerк тому же, ты не прав:
Код: vbnet
1.
2.
?typename(int(4.56))
Double



Все равно возвращает integer, хоть и типа double (согласно Help).

авторBoth Int and Fix remove the fractional part of number and return the resulting integer value.
...
Рейтинг: 0 / 0
Число ПИ
    #38518202
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати char встречается два раза в исходнике
...
Рейтинг: 0 / 0
Число ПИ
    #38518206
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnВсе равно возвращает integer, хоть и типа double (согласно Help).

авторBoth Int and Fix remove the fractional part of number and return the resulting integer value.
в данном случае слово integer означает не тип данных, а является частью фразы "...возвращает получившееся целое значение"
VolodbkaВот на размышлениеНад чем размышлять-то? Работает? нет?
...
Рейтинг: 0 / 0
Число ПИ
    #38518207
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
VladConnВсе равно возвращает integer, хоть и типа double (согласно Help).

пропущено...
в данном случае слово integer означает не тип данных, а является частью фразы "...возвращает получившееся целое значение"
VolodbkaВот на размышлениеНад чем размышлять-то? Работает? нет?

А я про тип и не писал.
...
Рейтинг: 0 / 0
Число ПИ
    #38518339
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProСледует переписать
Зачем?
hx[i] -> Hex(i)
...
Рейтинг: 0 / 0
Число ПИ
    #38518341
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Зачем?
hx[i] -> Hex(i)дельная мысль. Ну это уже из области оптимизации алгоритма, а не тупого перевода. Думаю, там можно еще что-нить подправить, если подумать.
...
Рейтинг: 0 / 0
Число ПИ
    #38518537
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.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
Option Explicit

Public Const eps As Double = 1E-17
Public Const NHX  As Double = 16

' Код программы помещают в модуль VBA Excel, печать результата производится на активный лист,
' подключение библиотек, форм и т.п. не требуется.

    Public Sub main()
    Dim i
    
    Dim pid As Double
    Dim s1 As Double
    Dim s2 As Double
    Dim s3 As Double
    Dim s4 As Double
    'Dim series#(m%, N%)
    Dim id 'as integer
    '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)
    i = i + 1
    ActiveSheet.Cells(i, 1) = id 'выводит результат на активный лист
    ActiveSheet.Cells(i, 2) = pid
    ActiveSheet.Cells(i, 3) = "chx"
    End Sub
  
    Public Function ihex(ByVal x As Double, ByVal NHX As Integer, ByRef chx)
    
    'Возвращает, в СНХ, первые NHX шестигранные цифры фракции х.
    
    Dim i As Integer
    Dim y As Double
    Dim hx
        
        hx = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F")
    
        y = Abs(x)
    
    For i = 0 To NHX - 1
        y = 16 * (y - Int(y))
        chx(i) = hx(Int(y))
    Next NHX
    
    End Function

    
    
    Public Function series(ByVal m As Integer, ByVal id) 'id as integer
    'Эта процедура оценивает серию sum_k 16 ^ (ID-K) / (8 * K + M)
    'используя модульную технику возведения в степень.
    Dim k As Integer
    Dim ak As Double
    Dim eps As Double
    Dim p As Double
    Dim s As Double
    Dim t As Double
    
    s = 0

    'Суммирует ряд до идентификатора
 
    For k = 0 To id - 1 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 - 1 + 100 Step 1
            ak = 8 * k + m
            
           't = pow (16., (double) (id - k)) / ak;
            t = 16 ^ ((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 As Double, ByVal ak As Double)
    'expm = 16 ^ р мод ak. Эта процедура использует бинарную схему
    'возведения в степень слева-направо.

    Dim i As Integer
    Dim j As Integer
    Dim p1 As Double
    Dim pt As Double
    Dim r As Double
    Dim ntp As Integer
    
    Static tp(25) As Double
    Static tp1 As Integer
    
    ntp = 25
    
    'Если это первый вызов expm, то заполнить массив tp.
    If tp1 <> 1 Then
        tp1 = 1
        tp(0) = 1

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

    If ak = 1 Then expm = 0

    'Найти наибольшую степень двойки меньше или равной р.
        For i = 0 To ntp - 1 Step 1
            If tp(i) > p Then Exit For
        Next i
            
            pt = tp(i - 1)
            p1 = p
            r = 1
    
    'Выполняет бинарный алгоритм возведения в степень по модулю ак.
    For j = 1 To i - 1 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



' Эта программа реализует алгоритм BBP генерировать несколько
' шестнадцатеричных цифр, начиная сразу после заданной позиции ID,
' или, другими словами, начиная с позиции ID + 1. На большинстве систем,
' использующих 64-разрядную арифметику IEEE с плавающей запятой,
' этот код работает правильно, пока г меньше примерно 1,18 х 10 ^ 7.
' Если 80-битный арифметическое могут быть использованы,
' этот предел значительно выше. Независимо арифметика используется,
' результаты для данной позиции ID можно проверить путем повторения с ID-1 или ID 1,
' и проверки, что шестнадцатеричные цифры прекрасно перекрывают со смещением одного,
' за исключением, возможно в течение нескольких хвостовых цифр. Полученные фракции,
' как правило, с точностью не менее 11 десятичных цифр, и, по крайней мере 9 шестнадцатеричных цифр.
...
Рейтинг: 0 / 0
Число ПИ
    #38518545
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть такая строчка в Sub Main()
printf (" position = %i\n fraction = %.15f \n hex digits = %10.10s\n",id, pid, chx)

правильно ли я понимаю что это вывод значений id, pid, chx. Непонятно что за переменная i в ней, пытаюсь реализовать вывод через cells на активный лист
...
Рейтинг: 0 / 0
Число ПИ
    #38518670
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, это вывод id, pid, chx
i - это не переменная
http://www.cplusplus.com/reference/cstdio/printf/
...
Рейтинг: 0 / 0
Число ПИ
    #38519151
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, с Рождеством.

1 В общем я заменил тип Double на Variant, думаю на первых десяти итерациях счёта это замена не сильно повлияет на результат.
2 Завёл в блок main() цикл с переменной id.

Не могу разобраться в корреляциях между функциями.
Функция expm() подчинена функции series(), функция series() подчинена блоку main().

Проблема в завязке блока main() и функции ihex.

Зачем в функции ihex в связях прописана константа nhx, в моём понимание её наличие или отсутствие погоды не сделают, видимо это синтаксис С++? А может nhx вовсе и не константа, а переменная? Или днём константа, ночью переменная, многостоночница какая-та.

Опять в связях функции ihex сидит загадочная дама X, кто и как с ней работает для меня пока загадка.

В С++

Код: 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;
}



в VBA

Код: 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.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
 Option Explicit
 
    Public Const eps As Variant = 1E-17
    Public Const NHX  As Integer = 16

' Код программы помещают в модуль VBA Excel, печать результата производится на активный лист,
' подключение библиотек, форм и т.п. не требуется.

    Public Sub main()
    
    Dim pid As Variant
    Dim s1 As Variant
    Dim s2 As Variant
    Dim s3 As Variant
    Dim s4 As Variant
    Dim id As Integer
    'void ihex(x%, m%, char c())
    
    For id = 1 To 1000 Step 1
    'id = 1000
    '#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 - Int(pid) + 1
    'ihex (pid, NHX, chx)
    'printf (" position = %i\n fraction = %.15f \n hex digits = %10.10s\n",id, pid, chx)

    ActiveSheet.Cells(Int(id), 1) = id 'выводит результат на активный лист
    ActiveSheet.Cells(Int(id), 2) = pid
   ' ActiveSheet.Cells(i, 3) = "chx"
    Next id
    
    End Sub
 
    Public Function ihex(ByVal x As Variant, ByVal NHX As Integer, ByVal chx)
    
    'Возвращает, в СНХ, первые NHX шестигранные цифры фракции х.
    
    Dim i As Integer
    Dim y As Variant
    Dim hx
              
        hx = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F")
    
        y = Abs(x)
    
    For i = 1 To NHX - 1
        y = 16 * (y - Int(y))
        chx(i) = hx(Int(y))
    Next i
    
    End Function
 
    Public Function series(ByVal m As Integer, ByVal id As Integer) 'id as integer
    'Эта процедура оценивает серию sum_k 16 ^ (ID-K) / (8 * K + M)
    'используя модульную технику возведения в степень.
    Dim k As Integer
    Dim ak As Variant
   
    Dim p As Variant
    Dim s As Variant
    Dim t As Variant
    
    s = 0

    'Суммирует ряд до идентификатора
 
    For k = 1 To id - 1 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 - 1 + 100 Step 1
            ak = 8 * k + m
            
           't = pow (16., (double) (id - k)) / ak;
            t = (16 ^ (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 As Variant, ByVal ak As Variant)
    'expm = 16 ^ р мод ak. Эта процедура использует бинарную схему
    'возведения в степень слева-направо.

    Dim i As Variant
    Dim j As Variant
    Dim p1 As Variant
    Dim pt As Variant
    Dim r As Variant
    Dim ntp As Variant
    
    Static tp(25) As Variant
    Static tp1 As Variant
    
    ntp = 25 '25
    
    'Если это первый вызов expm, то заполнить массив tp.
    If tp1 <> 1 Then
        tp1 = 1
        tp(0) = 1

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

    If ak = 1 Then expm = 0

    'Найти наибольшую степень двойки меньше или равной р.
        For i = 1 To ntp - 1 Step 1
            If tp(i) > p Then Exit For
        Next i
            
            pt = tp(i - 1)
            p1 = p
            r = 1
    
    'Выполняет бинарный алгоритм возведения в степень по модулю ак.
    For j = 1 To i - 1 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
Число ПИ
    #38519156
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это результат
...
Рейтинг: 0 / 0
Число ПИ
    #38519185
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volodbka1 В общем я заменил тип Double на Variantа в чем глубокий смысл? Variant не есть тип сам по себе, переменная, которая хранится в Variant все равно имеет какой-то конкретный тип
Volodbka2 Завёл в блок main() цикл с переменной id.А это для чего? В оригинале никакого цикла нет, и id имеет значение 1000000
VolodbkaНе могу разобраться в корреляциях между функциями.
Функция expm() подчинена функции series(), функция series() подчинена блоку main().дополнительное объявление series в main по-моему надо просто проигнорировать
VolodbkaЗачем в функции ihex в связях прописана константа nhxгде? я такого не нашел
Volodbkaзагадочная дама X, кто и как с ней работает для меня пока загадка.а это? y = fabs (x);
...
Рейтинг: 0 / 0
Число ПИ
    #38519192
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProVolodbka1 В общем я заменил тип Double на Variantа в чем глубокий смысл? Variant не есть тип сам по себе, переменная, которая хранится в Variant все равно имеет какой-то конкретный типвот у тебя код
Код: vbnet
1.
2.
    Dim s As Variant
    s = 0

в этот момент s имеет тип Integer, как там дальше вычисления пойдут - фиг его знает и зачем об этом думать. Верни Double туда, где было double
...
Рейтинг: 0 / 0
Число ПИ
    #38519260
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProVariant не есть тип сам по себе, переменная, которая хранится в Variant все равно имеет какой-то конкретный тип
Например Decimal.
...
Рейтинг: 0 / 0
Число ПИ
    #38519332
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погуглил немного, я то думал что эта программа считает само число ПИ, а она оказывается считает какой-то маленький его отрезок, видимо с помощью id задаётся начальная координата этого отрезка.
...
Рейтинг: 0 / 0
Число ПИ
    #38519341
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вы и настрадали тут все

Volodbkaя то думал что эта программа считает само число ПИ, а она оказывается считает...То есть ты стал адаптировать алгоритм, даже не прочитав материал? Даже по-русски? Падаю просто...
http://ru.wikipedia.org/wiki/Формула_Бэйли_—_Боруэйна_—_Плаффа
http://habrahabr.ru/post/179829/

Считает же алгоритм указанную (id) шестнадцатиричную цифру в последовательности числа пи.

Наслаждайтесь, адаптаторы:
VBA
Код: 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.
' Adapted for VBA
' AndreTM, 2014-01-08

Const NHX = 16
Const eps = 1E-17
Const ntp = 25

Dim tp#(ntp)

'/*
'    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 */

Sub main()

    Dim pid#, s1#, s2#, s3#, s4#
    Dim chx As String * NHX
    Dim id&
    id = 10000

'/*  id is the digit position.  Digits generated follow immediately after id. */
    
    tp_init
    
    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 - CLng(pid) + 1#
    ihex pid, NHX, chx

'    printf (" position = %i\n fraction = %.15f \n hex digits =  %10.10s\n", id, pid, chx);
    MsgBox " position = " & id & vbCrLf & _
        " fraction = " & pid & vbCrLf & _
        " hex digits = " & chx
    
End Sub

Sub tp_init()
'/*  If this is the first call to expm, fill the power of two table tp. */

    tp(0) = 1
    For i = 1 To ntp - 1: tp(i) = 2# * tp(i - 1): Next

End Sub

Sub ihex(x#, NHX&, ByRef chx)
'/*  This returns, in chx, the first nhx hex digits of the fraction of x. */

    Dim i&
    Dim y#
    Const hx = "0123456789ABCDEF"

    y = Abs(x)

    chx = ""
    For i = 0 To NHX - 1
        y = 16# * (y - Fix(y))
        chx = chx & Mid(hx, CLng(y) + 1, 1)
    Next

End Sub

Function series(m&, id&) As Double
'/*  This routine evaluates the series  sum_k 16^(id-k)/(8*k+m)
'    using the modular exponentiation technique. */
    
    Dim k&
    Dim ak#, eps#, p#, s#, t#

    s = 0#

'/*  Sum the series up to id. */

    For k = 0 To id - 1
        ak = 8 * k + m
        p = id - k
        t = expm(p, ak)
        s = s + t / ak
        s = s - CLng(s)
    Next

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

    For k = id To id + 100
        ak = 8 * k + m
        t = (16# ^ CDbl(id - k)) / ak
        If t < eps Then Exit For
        s = s + t
        s = s - CLng(s)
    Next
  
    series = s

End Function

Function expm(p As Double, ak As Double) As Double
'/*  expm = 16^p mod ak.  This routine uses the left-to-right binary
'    exponentiation scheme. */
    
    If ak = 1# Then expm = 0#: Exit Function
    
    Dim i&, j&
    Dim p1#, pt#, r#

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

    For i = 0 To ntp - 1
        If tp(i) > p Then Exit For
    Next

    pt = tp(i - 1)
    p1 = p
    r = 1#

'/*  Perform binary exponentiation algorithm modulo ak. */

    For j = 1 To i
        If (p1 >= pt) Then
            r = 16# * r
            r = r - CLng((r / ak) * ak)
            p1 = p1 - pt
        End If
        pt = pt / 2
        If (pt >= 1#) Then
            r = r * r
            r = r - CLng((r / ak) * ak)
        End If
    Next

    expm = r

End Function

...
Рейтинг: 0 / 0
Число ПИ
    #38519352
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где тут какой id совпадает?
...
Рейтинг: 0 / 0
Число ПИ
    #38519422
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работает для id =0,1,2

Код: 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.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
Const NHX = 16
Const eps = 1E-17
Const ntp = 25

Dim tp#(0 To 25)

'/*
'    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 */

Sub main()

    Dim pid As Double, s1 As Double, s2 As Double, s3 As Double, s4 As Double
    Dim chx As String * 16
    Dim id As Integer
 
    id = 2 'работает при id = 0, 1, 2
'/*  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);
   MsgBox " position = " & id & vbCrLf & _
       " fraction = " & pid & vbCrLf & _
      " hex digits = " & chx & vbCrLf & _
    " Pi = 3,243F6A8885A308D31319"
    
 
End Sub



Sub ihex(x As Double, NHX As Integer, ByRef chx)
'/*  This returns, in chx, the first nhx hex digits of the fraction of x. */

    Dim i As Integer
    Dim y As Double
    'Const hx = "0123456789ABCDEF"
    hx = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F")
    y = Abs(x)

    chx = ""
    For i = 0 To NHX Step 1
        y = 16# * (y - Fix(y))
        chx = chx & hx(Int(y))
    Next

End Sub

   Public Function series(ByVal m As Integer, ByVal id As Integer)
    'Эта процедура оценивает серию sum_k 16 ^ (ID-K) / (8 * K + M)
    'используя модульную технику возведения в степень.
    Dim k As Integer
    Dim ak As Double
    Dim eps As Double
    Dim p As Double
    Dim s As Double
    Dim t As Double
    
    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;
            t = 16 ^ (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 As Double, ByVal ak As Double)
    'expm = 16 ^ р мод ak. Эта процедура использует бинарную схему
    'возведения в степень слева-направо.

    Dim i As Integer
    Dim j As Integer
    Dim p1 As Double
    Dim pt As Double
    Dim r As Double
    Dim ntp As Double
    
     
    'Если это первый вызов expm, то заполнить массив tp.
    If tp1 <> 1 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
            i = 1
            Exit Function
            End If
        Next i
            
            pt = tp(i - 1)
            p1 = p
            r = 1
    
    'Выполняет бинарный алгоритм возведения в степень по модулю ак.
    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
Число ПИ
    #38535303
Vova Melnikov 888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Volodbka,
Эти две строки заставляют считовать из файлов в скобках код и встальять код программы
...
Рейтинг: 0 / 0
Число ПИ
    #38536056
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что есть на сегодняшний день, это следующий код. Он конечно не рабочий, но есть небольшие зацепки и возникает понимание как он работает. Закрыл часть кода в комментарии. И исправил одну строчку в функции series#
For k = 0 To id + 100 Step 1
а должно быть что-то типа
For k = id To id + 100 Step 1
Благодаря этому стало понятно, что первый цикл формирует базисный результат, а вот второй цикл формирует текущий результат. Кажется, что они похожи, только первый цикл видимо более тщательно считает.
Следовательно надо научить работать первый цикл, он ссылается на функцию, то есть вполне вероятно что ошибка может находится и там.
Полагаю, удастся не заморачиваясь на специальных функциях заставить код работать.
Данный код будет выдавать при введение числа id результат верный для первых чисел.

Код: 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.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
Option Explicit

Const NHX = 16
Const eps = 1E-17
Const ntp = 25 '

Dim tp#(0 To 25)
Const id = 5

'Dim ak As Double


'/*
'    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 */

Sub main()
'DoEvents
    Dim pid As Double, s1 As Double, s2 As Double, s3 As Double, s4 As Double
    Dim chx As String * 16
  '  Dim id As Integer
 
 '   id = 3 '&#240;&#224;&#225;&#238;&#242;&#224;&#229;&#242; &#239;&#240;&#232; id = 0, 1, 2
'/*  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);
   MsgBox " position = " & id & vbCrLf & _
       " fraction = " & pid & vbCrLf & _
      " hex digits = " & chx & vbCrLf & _
    " Pi = 3,243F6A8885A308D31319"
 
End Sub



Sub ihex(x As Double, NHX As Integer, ByRef chx)
'/*  This returns, in chx, the first nhx hex digits of the fraction of x. */

    Dim i As Integer
    Dim y As Double
    Dim hx
    'Const hx = "0123456789ABCDEF"
   hx = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F")
    y = Abs(x)

    chx = ""
    For i = 0 To NHX - 1 Step 1
        y = 16# * (y - Fix(y))
        chx = chx & hx(Int(y))
    Next

End Sub

   Public Function series#(ByVal m As Integer, ByVal id As Integer)
    '&#221;&#242;&#224; &#239;&#240;&#238;&#246;&#229;&#228;&#243;&#240;&#224; &#238;&#246;&#229;&#237;&#232;&#226;&#224;&#229;&#242; &#241;&#229;&#240;&#232;&#254; sum_k 16 ^ (ID-K) / (8 * K + M)
    '&#232;&#241;&#239;&#238;&#235;&#252;&#231;&#243;&#255; &#236;&#238;&#228;&#243;&#235;&#252;&#237;&#243;&#254; &#242;&#229;&#245;&#237;&#232;&#234;&#243; &#226;&#238;&#231;&#226;&#229;&#228;&#229;&#237;&#232;&#255; &#226; &#241;&#242;&#229;&#239;&#229;&#237;&#252;.
    Dim k As Integer
    Dim ak As Double
    'Dim eps As Double
    Dim p As Double
    Dim s As Double
    Dim t As Double
  
    s = 0

    '&#209;&#243;&#236;&#236;&#232;&#240;&#243;&#229;&#242; &#240;&#255;&#228; &#228;&#238; &#232;&#228;&#229;&#237;&#242;&#232;&#244;&#232;&#234;&#224;&#242;&#238;&#240;&#224;
 
   'For k = 0 To id - 1 Step 1
   '    ak = 8 * k + m
    '    p = id - k
   '     t = expm(p, ak)
   '     s = s + t / ak
   '     s = s - Int(s)
   ' Next k

    '&#194;&#251;&#247;&#232;&#241;&#235;&#255;&#229;&#242; &#237;&#229;&#241;&#234;&#238;&#235;&#252;&#234;&#238; &#242;&#229;&#240;&#236;&#232;&#237;&#238;&#226;, &#227;&#228;&#229; &#234;> = ID.

    For k = 0 To id + 100 Step 1
            ak = 8 * k + m
            p = id - k
           't = pow (16., (double) (id - k)) / ak;
        't = Format(CVar(power(id - k)), "0.000000000E+00") / ak
            
            t = (16 ^ (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 As Double, ByVal ak As Double)
    'expm = 16 ^ &#240; &#236;&#238;&#228; ak. &#221;&#242;&#224; &#239;&#240;&#238;&#246;&#229;&#228;&#243;&#240;&#224; &#232;&#241;&#239;&#238;&#235;&#252;&#231;&#243;&#229;&#242; &#225;&#232;&#237;&#224;&#240;&#237;&#243;&#254; &#241;&#245;&#229;&#236;&#243;
    '&#226;&#238;&#231;&#226;&#229;&#228;&#229;&#237;&#232;&#255; &#226; &#241;&#242;&#229;&#239;&#229;&#237;&#252; &#241;&#235;&#229;&#226;&#224;-&#237;&#224;&#239;&#240;&#224;&#226;&#238;.

    Dim i As Integer
    Dim j As Integer
    Dim tp1 As Double
    Dim pt As Double
    Dim p1 As Double
    Dim r As Double
    'Dim ntp As Double
    
     
    '&#197;&#241;&#235;&#232; &#253;&#242;&#238; &#239;&#229;&#240;&#226;&#251;&#233; &#226;&#251;&#231;&#238;&#226; expm, &#242;&#238; &#231;&#224;&#239;&#238;&#235;&#237;&#232;&#242;&#252; &#236;&#224;&#241;&#241;&#232;&#226; tp.
    If Val(tp1) = 0 Then
        tp1 = 1
        tp(0) = 1

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

    If ak = 1 Then expm = 0

    '&#205;&#224;&#233;&#242;&#232; &#237;&#224;&#232;&#225;&#238;&#235;&#252;&#248;&#243;&#254; &#241;&#242;&#229;&#239;&#229;&#237;&#252; &#228;&#226;&#238;&#233;&#234;&#232; &#236;&#229;&#237;&#252;&#248;&#229; &#232;&#235;&#232; &#240;&#224;&#226;&#237;&#238;&#233; &#240;.
        For i = 0 To ntp - 1 Step 1
            If tp(i) > p Then
            'i = 1
            Exit Function
        
            End If
        Next i
            
            pt = tp(i - 1)
            p1 = p
            r = 1
    
    '&#194;&#251;&#239;&#238;&#235;&#237;&#255;&#229;&#242; &#225;&#232;&#237;&#224;&#240;&#237;&#251;&#233; &#224;&#235;&#227;&#238;&#240;&#232;&#242;&#236; &#226;&#238;&#231;&#226;&#229;&#228;&#229;&#237;&#232;&#255; &#226; &#241;&#242;&#229;&#239;&#229;&#237;&#252; &#239;&#238; &#236;&#238;&#228;&#243;&#235;&#254; &#224;&#234;.
    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
Число ПИ
    #38536057
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увы, не смог вставить в русской кодировке, сгодится пока и так
...
Рейтинг: 0 / 0
Число ПИ
    #38551170
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.
146.
147.
Option Explicit

Const NHX = 16
Const eps = 1E-17
Const ntp = 25

Dim tp#(0 To 25)

'Идентификатор положения цифры. Цифры генерируются сразу за идентификатором.
Const id = 5


'Эта программа реализует алгоритм BBP генерирует несколько шестнадцатеричных цифр,
'начиная сразу после заданной позиции ID, или, другими словами, начиная с позиции ID + 1.

'Исходный код: David H. Bailey     2006-09-08

'Адаптировал под семейство "VB" Vladimir-Vladimirko@rambler.ru  05.02.2014

Sub main()

    Dim pid As Double, s1 As Double, s2 As Double, s3 As Double, s4 As Double
    Dim chx As String * 16
    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

   MsgBox " position = " & id & vbCrLf & _
      " hex digits = " & chx & vbCrLf & _
      " Pi = 3,243F6A8885A308D31319"
 
End Sub

Sub ihex(x As Double, NHX As Double, ByRef chx)
'Возвращает, в СНХ, первые NHX шестнадцатеричных цифры фракции х
    Dim i As Double
    Dim y As Double

    y = Abs(x)

    chx = ""
    For i = 0 To NHX - 1 Step 1
        y = 16# * (y - Fix(y))
        chx = chx & Hex(Int(y))
    Next

End Sub

   Public Function series#(ByVal m As Double, ByVal id As Double)
    'Эта процедура оценивает серию sum_k 16 ^ (ID-K) / (8 * K + M)
    'используя модульную технику возведения в степень.
    Dim k As Double
    Dim ak As Double
    Dim p As Double
    Dim s As Double
    Dim t As Double
  
    s = 0
    'Суммирует ряд до идентификатора
   
   For k = 0 To id - 1 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
            p = id - k
            t = (16 ^ (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 As Double, ByVal ak As Double)
    'expm = 16 ^ р мод ak. Эта процедура использует бинарную схему
    'возведения в степень слева-направо.

    Dim i As Double
    Dim j As Double
    Dim tp1 As Double
    Dim pt As Double
    Dim p1 As Double
    Dim r As Double
    
    'Если это первый вызов expm, то заполнить массив tp.
    If Val(tp1) = 0 Then
        tp1 = 1
        tp(0) = 1

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

    If ak = 1 Then
    expm = 0
    Exit Function
    End If
    
    'Найти наибольшую степень двойки меньше или равной р.
        For i = 0 To ntp - 1 Step 1
            If tp(i) >= p Then
            i = i + 1
            Exit For
        
            End If
        Next i
            
            pt = tp(i - 1)
            p1 = p
            r = 1
    
    'Выполняет бинарный алгоритм возведения в степень по модулю ак.
    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
Число ПИ
    #38552684
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть два числа ПИ, взятых из википедии:

- десятичное 3,1415926535897932384626433832795;

- шестнадцатеричное 3,243F6A8885A308D31319.

Как перевести из одной системы счисления в другую и получить корректный результат? Пытался с помощью функций экселя, калькулятора виндовс, вручную не получилось.

Брешут янки!
...
Рейтинг: 0 / 0
Число ПИ
    #38552721
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Онлайн-калькулятором не пробовал воспользоваться?
...
Рейтинг: 0 / 0
Число ПИ
    #38552727
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Формула Excel для перевода ДРОБНОЙ ЧАСТИ 16-ричной дроби в десятичную

=СУММПРОИЗВ(ШЕСТН.В.ДЕС(ПСТР(A1;СТРОКА(1:15);1));16^-СТРОКА(1:15))

"243F6A8885A308D31319" -> 0,141592653589793
...
Рейтинг: 0 / 0
Число ПИ
    #38554045
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всё работает!
От десятичной запятой я такого не ожидал, буду потихоньку разбираться :)
...
Рейтинг: 0 / 0
88 сообщений из 88, показаны все 4 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Число ПИ
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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