#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>
#include <string.h>
void summ(unsigned a[16], unsigned b[16], unsigned c[16]) //a = b + c //correct
{
int i;
int flag = 0;
unsigned long long res;
for(i = 0; i < 16; i++)
{
res = b[i];
res += c[i] + flag;
a[i] = res;
flag = res >> 32;
}
}
void neg(unsigned x[16]) // -x //correct
{
int i;
for(i = 0; i < 16; i++)
{
x[i] = ~x[i];
}
for(i = 0; i < 16; i++)
{
x[i]++;
if(x[i] != 0)
{
break;
}
}
}
void mult(unsigned a[16], unsigned b[16], unsigned c) // a = b * c //correct
{
int i;
int flag = 0;
unsigned long long res;
for(i = 0; i < 16; i++)
{
res = b[i];
res = res*c + flag;
a[i] = res;
flag = res >> 32;
}
}
void divide(unsigned a[16], unsigned b[16], unsigned c) // a = b / c //correct
{
int i;
int flag = 0;
unsigned long long d;
unsigned long long res;
for(i = 15; i >= 0; i--)
{
res = b[i];
d = flag;
res += d << 32;
a[i] = res/c;
flag = res % c;
}
}
void longtodecimal(unsigned a[10], unsigned b[100], unsigned x[16]) // a[10]...a[1]a[0].b[1]b[2]...b[100]...
{
unsigned x1[16];
unsigned x2[16];
unsigned x3[16];
unsigned y[16];
unsigned y1[16];
unsigned y2[16];
int i;
int j;
memcpy(y
, x
, 16*sizeof(unsigned));
for (i = 0; i < 10; i++) //wrong перевод целой части
{
memcpy(x1
, x
, 16*sizeof(unsigned));
for(j = 0; j < 12; j++)
{
x1[j] = 0;
}
divide(x2, x1, 10);
memcpy(x
, x2
, 16*sizeof(unsigned));
for(j = 12; j < 16; j++)
{
x2[j] = 0;
}
mult(x3, x2, 10);
a[i] = x3[12];
}
for(i = 0; i < 100; i++) //wrong перевод дробной части
{
memcpy(y1
, y
, 16*sizeof(unsigned));
for(j = 12; j < 16; j++)
{
y1[j] = 0;
}
mult(y2, y1, 10);
memcpy(y
, y2
, 16*sizeof(unsigned)); b[i] = y2[12];
}
}
void arctan(unsigned x[16], int arg) // arctan(1/arg) //correct
{
unsigned x1[16];
unsigned x2[16];
unsigned sprom[16];
unsigned sfinal[16];
unsigned x3[16];
int i;
int k = 1;
for(i = 0; i < 16; i++)
{
x1[i] = 0;
sprom[i] = 0;
}
x1[12] = 1;
divide(x2, x1, arg);
summ(sfinal, sprom, x2);
memcpy(sprom
, sfinal
, 16*sizeof(unsigned)); // artan = 1/arg memcpy(x1
, x2
, 16*sizeof(unsigned)); k = 3;
for(i = 1; i < 7000; i++)
{
divide(x2, x1, arg*arg);
memcpy(x3
, x2
, 16*sizeof(unsigned));
divide(x2, x3, k);
if(i % 2 == 1)
{
neg(x2);
}
summ(sfinal, sprom, x2);
memcpy(sprom
, sfinal
, 16*sizeof(unsigned)); memcpy(x1
, x3
, 16*sizeof(unsigned)); k = k + 2;
}
memcpy(x
, sfinal
, 16*sizeof(unsigned)); }
void find_Pi(unsigned x[16]) //correct
{
unsigned x1[16];
unsigned x2[16];
unsigned x3[16];
unsigned atn18[16];
unsigned atn57[16];
unsigned atn239[16];
unsigned s1[16];
unsigned s2[16];
arctan(atn18, 18);
arctan(atn57, 57);
arctan(atn239, 239);
mult(x1, atn18, 12);
mult(x2, atn57, 8);
mult(x3, atn239, 5);
neg(x3);
summ(s1, x1, x2);
summ(s2, s1, x3);
mult(x, s2, 4);
}
int main(void)
{
//FILE *outp;
unsigned a[10];
unsigned b[100];
unsigned x[16];
unsigned c[16];
unsigned d[16];
int p = 9;
int i;
find_Pi(x);
/*for(i = 0; i < 16; i++)
{
d[i] = 0;
}
d[12] = 1;
mult(c, d, 12);
summ(d, c, x);
memcpy(x, d, 16*sizeof(unsigned));*/ //Тут я делал Пи+12 чтоб проверить, выводит ли правильно две цифры целой части полученного числа
longtodecimal(a, b, x);
while(a[p] == 0)
{
p--;
}
for(i = p; i >= 0; i--)
{
}
for(i = 0; i < 100; i++)
{
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPG1hbGxvYy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+Cgp2b2lkIHN1bW0odW5zaWduZWQgYVsxNl0sIHVuc2lnbmVkIGJbMTZdLCB1bnNpZ25lZCBjWzE2XSkgLy9hID0gYiArIGMgLy9jb3JyZWN0CnsKICAgIGludCBpOwogICAgaW50IGZsYWcgPSAwOwogICAgdW5zaWduZWQgbG9uZyBsb25nIHJlczsKCiAgICBmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQogICAgewogICAgICAgIHJlcyA9IGJbaV07CiAgICAgICAgcmVzICs9IGNbaV0gKyBmbGFnOwogICAgICAgIGFbaV0gPSByZXM7CiAgICAgICAgZmxhZyA9IHJlcyA+PiAzMjsKICAgIH0KfQoKdm9pZCBuZWcodW5zaWduZWQgeFsxNl0pIC8vIC14IC8vY29ycmVjdAp7CiAgICBpbnQgaTsKCiAgICBmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQogICAgewogICAgICAgIHhbaV0gPSB+eFtpXTsKICAgIH0KCiAgICBmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQogICAgewogICAgICAgIHhbaV0rKzsKCiAgICAgICAgaWYoeFtpXSAhPSAwKQogICAgICAgIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIG11bHQodW5zaWduZWQgYVsxNl0sIHVuc2lnbmVkIGJbMTZdLCB1bnNpZ25lZCBjKSAvLyBhID0gYiAqIGMgLy9jb3JyZWN0CnsKICAgIGludCBpOwogICAgaW50IGZsYWcgPSAwOwogICAgdW5zaWduZWQgbG9uZyBsb25nIHJlczsKCiAgICBmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQogICAgewogICAgICAgIHJlcyA9IGJbaV07CiAgICAgICAgcmVzID0gcmVzKmMgKyBmbGFnOwogICAgICAgIGFbaV0gPSByZXM7CiAgICAgICAgZmxhZyA9IHJlcyA+PiAzMjsKICAgIH0KfQoKdm9pZCBkaXZpZGUodW5zaWduZWQgYVsxNl0sIHVuc2lnbmVkIGJbMTZdLCB1bnNpZ25lZCBjKSAvLyBhID0gYiAvIGMgLy9jb3JyZWN0CnsKICAgIGludCBpOwogICAgaW50IGZsYWcgPSAwOwogICAgdW5zaWduZWQgbG9uZyBsb25nIGQ7CiAgICB1bnNpZ25lZCBsb25nIGxvbmcgcmVzOwoKICAgIGZvcihpID0gMTU7IGkgPj0gMDsgaS0tKQogICAgewogICAgICAgIHJlcyA9IGJbaV07CiAgICAgICAgZCA9IGZsYWc7CiAgICAgICAgcmVzICs9IGQgPDwgMzI7CiAgICAgICAgYVtpXSA9IHJlcy9jOwogICAgICAgIGZsYWcgPSByZXMgJSBjOwogICAgfQp9Cgp2b2lkIGxvbmd0b2RlY2ltYWwodW5zaWduZWQgYVsxMF0sIHVuc2lnbmVkIGJbMTAwXSwgdW5zaWduZWQgeFsxNl0pIC8vIGFbMTBdLi4uYVsxXWFbMF0uYlsxXWJbMl0uLi5iWzEwMF0uLi4KewogICAgdW5zaWduZWQgeDFbMTZdOwogICAgdW5zaWduZWQgeDJbMTZdOwogICAgdW5zaWduZWQgeDNbMTZdOwogICAgdW5zaWduZWQgeVsxNl07CiAgICB1bnNpZ25lZCB5MVsxNl07CiAgICB1bnNpZ25lZCB5MlsxNl07CiAgICBpbnQgaTsKICAgIGludCBqOwoKICAgIG1lbWNweSh5LCB4LCAxNipzaXplb2YodW5zaWduZWQpKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgLy93cm9uZyDQv9C10YDQtdCy0L7QtCDRhtC10LvQvtC5INGH0LDRgdGC0LgKICAgIHsKICAgICAgICBtZW1jcHkoeDEsIHgsIDE2KnNpemVvZih1bnNpZ25lZCkpOwoKICAgICAgICBmb3IoaiA9IDA7IGogPCAxMjsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgeDFbal0gPSAwOwogICAgICAgIH0KCiAgICAgICAgZGl2aWRlKHgyLCB4MSwgMTApOwogICAgICAgIG1lbWNweSh4LCB4MiwgMTYqc2l6ZW9mKHVuc2lnbmVkKSk7CgogICAgICAgIGZvcihqID0gMTI7IGogPCAxNjsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgeDJbal0gPSAwOwogICAgICAgIH0KCiAgICAgICAgbXVsdCh4MywgeDIsIDEwKTsKICAgICAgICBhW2ldID0geDNbMTJdOwogICAgfQoKICAgIGZvcihpID0gMDsgaSA8IDEwMDsgaSsrKSAvL3dyb25nINC/0LXRgNC10LLQvtC0INC00YDQvtCx0L3QvtC5INGH0LDRgdGC0LgKICAgIHsKICAgICAgICBtZW1jcHkoeTEsIHksIDE2KnNpemVvZih1bnNpZ25lZCkpOwoKICAgICAgICBmb3IoaiA9IDEyOyBqIDwgMTY7IGorKykKICAgICAgICB7CiAgICAgICAgICAgIHkxW2pdID0gMDsKICAgICAgICB9CgogICAgICAgIG11bHQoeTIsIHkxLCAxMCk7CiAgICAgICAgbWVtY3B5KHksIHkyLCAxNipzaXplb2YodW5zaWduZWQpKTsKICAgICAgICBiW2ldID0geTJbMTJdOwogICAgfQp9Cgp2b2lkIGFyY3Rhbih1bnNpZ25lZCB4WzE2XSwgaW50IGFyZykgLy8gYXJjdGFuKDEvYXJnKSAvL2NvcnJlY3QKewogICAgdW5zaWduZWQgeDFbMTZdOwogICAgdW5zaWduZWQgeDJbMTZdOwogICAgdW5zaWduZWQgc3Byb21bMTZdOwogICAgdW5zaWduZWQgc2ZpbmFsWzE2XTsKICAgIHVuc2lnbmVkIHgzWzE2XTsKICAgIGludCBpOwogICAgaW50IGsgPSAxOwoKICAgIGZvcihpID0gMDsgaSA8IDE2OyBpKyspCiAgICB7CiAgICAgICAgeDFbaV0gPSAwOwogICAgICAgIHNwcm9tW2ldID0gMDsKICAgIH0KCiAgICB4MVsxMl0gPSAxOwoKICAgIGRpdmlkZSh4MiwgeDEsIGFyZyk7CiAgICBzdW1tKHNmaW5hbCwgc3Byb20sIHgyKTsKICAgIG1lbWNweShzcHJvbSwgc2ZpbmFsLCAxNipzaXplb2YodW5zaWduZWQpKTsgLy8gYXJ0YW4gPSAxL2FyZwogICAgbWVtY3B5KHgxLCB4MiwgMTYqc2l6ZW9mKHVuc2lnbmVkKSk7CiAgICBrID0gMzsKCiAgICBmb3IoaSA9IDE7IGkgPCA3MDAwOyBpKyspCiAgICB7CiAgICAgICAgZGl2aWRlKHgyLCB4MSwgYXJnKmFyZyk7CiAgICAgICAgbWVtY3B5KHgzLCB4MiwgMTYqc2l6ZW9mKHVuc2lnbmVkKSk7CgogICAgICAgIGRpdmlkZSh4MiwgeDMsIGspOwoKICAgICAgICBpZihpICUgMiA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgbmVnKHgyKTsKICAgICAgICB9CgogICAgICAgIHN1bW0oc2ZpbmFsLCBzcHJvbSwgeDIpOwogICAgICAgIG1lbWNweShzcHJvbSwgc2ZpbmFsLCAxNipzaXplb2YodW5zaWduZWQpKTsKICAgICAgICBtZW1jcHkoeDEsIHgzLCAxNipzaXplb2YodW5zaWduZWQpKTsKICAgICAgICBrID0gayArIDI7CiAgICB9CgogICAgbWVtY3B5KHgsIHNmaW5hbCwgMTYqc2l6ZW9mKHVuc2lnbmVkKSk7Cn0KCnZvaWQgZmluZF9QaSh1bnNpZ25lZCB4WzE2XSkgLy9jb3JyZWN0CnsKICAgIHVuc2lnbmVkIHgxWzE2XTsKICAgIHVuc2lnbmVkIHgyWzE2XTsKICAgIHVuc2lnbmVkIHgzWzE2XTsKICAgIHVuc2lnbmVkIGF0bjE4WzE2XTsKICAgIHVuc2lnbmVkIGF0bjU3WzE2XTsKICAgIHVuc2lnbmVkIGF0bjIzOVsxNl07CiAgICB1bnNpZ25lZCBzMVsxNl07CiAgICB1bnNpZ25lZCBzMlsxNl07CiAgICBhcmN0YW4oYXRuMTgsIDE4KTsKICAgIGFyY3RhbihhdG41NywgNTcpOwogICAgYXJjdGFuKGF0bjIzOSwgMjM5KTsKICAgIG11bHQoeDEsIGF0bjE4LCAxMik7CiAgICBtdWx0KHgyLCBhdG41NywgOCk7CiAgICBtdWx0KHgzLCBhdG4yMzksIDUpOwogICAgbmVnKHgzKTsKICAgIHN1bW0oczEsIHgxLCB4Mik7CiAgICBzdW1tKHMyLCBzMSwgeDMpOwogICAgbXVsdCh4LCBzMiwgNCk7Cn0KCmludCBtYWluKHZvaWQpCnsKICAgIC8vRklMRSAqb3V0cDsKICAgIHVuc2lnbmVkIGFbMTBdOwogICAgdW5zaWduZWQgYlsxMDBdOwogICAgdW5zaWduZWQgeFsxNl07CiAgICB1bnNpZ25lZCBjWzE2XTsKICAgIHVuc2lnbmVkIGRbMTZdOwogICAgaW50IHAgPSA5OwogICAgaW50IGk7CgogICAgZmluZF9QaSh4KTsKCiAgICAvKmZvcihpID0gMDsgaSA8IDE2OyBpKyspCiAgICB7CiAgICAgICAgZFtpXSA9IDA7CiAgICB9CgogICAgZFsxMl0gPSAxOwogICAgbXVsdChjLCBkLCAxMik7CiAgICBzdW1tKGQsIGMsIHgpOwogICAgbWVtY3B5KHgsIGQsIDE2KnNpemVvZih1bnNpZ25lZCkpOyovIC8v0KLRg9GCINGPINC00LXQu9Cw0Lsg0J/QuCsxMiDRh9GC0L7QsSDQv9GA0L7QstC10YDQuNGC0YwsINCy0YvQstC+0LTQuNGCINC70Lgg0L/RgNCw0LLQuNC70YzQvdC+INC00LLQtSDRhtC40YTRgNGLINGG0LXQu9C+0Lkg0YfQsNGB0YLQuCDQv9C+0LvRg9GH0LXQvdC90L7Qs9C+INGH0LjRgdC70LAKCiAgICBsb25ndG9kZWNpbWFsKGEsIGIsIHgpOwoKICAgIHdoaWxlKGFbcF0gPT0gMCkKICAgIHsKICAgICAgICBwLS07CiAgICB9CgogICAgZm9yKGkgPSBwOyBpID49IDA7IGktLSkKICAgIHsKICAgICAgICBwcmludGYoIiV1IiwgYVtpXSk7CiAgICB9CgogICAgcHJpbnRmKCIuIik7CgogICAgZm9yKGkgPSAwOyBpIDwgMTAwOyBpKyspCiAgICB7CiAgICAgICAgcHJpbnRmKCIldSIsIGJbaV0pOwogICAgfQoKICAgIHJldHVybiAwOwp9