Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Число ПИ / 25 сообщений из 88, страница 1 из 4
03.01.2014, 21:53
    #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
03.01.2014, 21:56
    #38517465
Volodbka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число ПИ
в с# реализован алгоритм формулы Бэйли — Боруэйна — Плаффа, объясните можно ли его перепмсать в VBA?
...
Рейтинг: 0 / 0
03.01.2014, 21:58
    #38517467
Volodbka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число ПИ
что делают вот эти две строчки?

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

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

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

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

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

http://en.wikipedia.org/wiki/David_H._Bailey
...
Рейтинг: 0 / 0
04.01.2014, 17:14
    #38517689
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число ПИ
Один из выводов, который был сделан Дэвидом Бейли и его соавторами, и благодаря которому он в частности стал известен, это то, что начиная с некоторой десятичной позиции, во многих числовых константах, включая и число пи, цифры могут, вообще говоря, быть случайными, т.е. в определенном смысле получать разные значения.
...
Рейтинг: 0 / 0
04.01.2014, 17:23
    #38517693
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число ПИ
Напомнило известную теорему Римана, постулирующую тот факт, что от перестановки мест слагаемых сумма, вообще говоря, меняется. Причем для любого наперед заданного числа и бесконечности всегда найдется такая перестановка слагаемых, которая дает в сумме это наперед заданное значение (при условии бесконечности числа слагаемых и их знакопеременности).
...
Рейтинг: 0 / 0
04.01.2014, 21:25
    #38517764
Volodbka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число ПИ
В общем плохо.
Что-то непонятное со шрифтами.
Я полагаю что тут следующие функции:
- main();
- ihex();
- series();
- expm ().
Пока буду разбираться с функцией expm.
...
Рейтинг: 0 / 0
04.01.2014, 21:29
    #38517766
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число ПИ
VolodbkaЧто-то непонятное со шрифтами.
браузер при посте шалит с шрифтами в юникоде. попробуй переключиться на русский перед вставкой из буфера или попробуй другой браузер (тренируйся с предварительным просмотром)
...
Рейтинг: 0 / 0
04.01.2014, 21:37
    #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
04.01.2014, 22:20
    #38517782
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число ПИ
Почему ты сделал числовые переменные текстовыми?
Это чревато многочисленными неявными преобразованиями при числовых операциях, а также ошибками, например "3"+"5" будет равно "35"
...
Рейтинг: 0 / 0
04.01.2014, 22:38
    #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
04.01.2014, 23:10
    #38517801
Volodbka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число ПИ
хорошо подправлю на # - ки
...
Рейтинг: 0 / 0
04.01.2014, 23:41
    #38517822
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число ПИ
VolodbkaА как это работает?итерационно и довольно быстро.

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


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