[ 簡単な説明 ]
ln625( )、ln75( )はそれぞれ ln(0.625)、ln(0.75)を計算する関数です。 ln( )は、引数が1以下の値の方が収束が早いため、この値を計算します。 ln(0.625) は、ln(10)=ln(16×0.625)=4×ln(2)+ln(0.625) の計算に使用します。 ln(0.75) は、ln(3)=ln(4×0.75)=2×ln(2)+ln(0.75) の計算に使用します。 |
関数プロトタイプ | 機能説明 | |
MPA e(void) | 定数計算 | ネピア定数(e) |
MPA pi(void) | 円周率π | |
MPA ln2(void) | ln 2 | |
MPA ln625(void) | ln 0.625 | |
MPA ln75(void) | ln 0.75 |
/* m_mak_v.c make MPA constant */ #include "mpa.h" /* e nepia's constant */ MPA e(void) { MPA a, t; int m; UINT k; a = t = _M0; a.zero = t.zero = 0; a.num[0] = 2; a.num[1] = t.num[1] = RADIX_2; k = 3; m = 1; while((m = m_div_ss(m, t, k, &t)) <= NMPA) { m_add1_a(&a, t); if(++k == RADIX) { fprintf(stderr, "Error : Too long in e()\n"); break; } } return a; } /* pi Calculating π */ MPA pi(void) { MPA a, t, u; int i, m; UINT k, *p, *q; t = u = _M0; t.sign = 1; t.zero = u.zero = 0; t.num[0] = 16; m_div_ss(0, t, 5, &t); a = t; i = m = 0; k = 1; while(1) { if((m = m_div_ss(m, t, 25, &t)) > NMPA) break; if((k += 2) >= RADIX) { fprintf(stderr, "Error : Too long in pi()\n"); return a; } while(i < m) u.num[i++] = 0; if(m_div_ss(m, t, k, &u) > NMPA) break; if(k & 2) m_sub1(&a, u); else m_add1(&a, u); } t = _M0; t.sign = 1; t.zero = 0; t.num[0] = 4; m_div_ss(0, t, 239, &t); m_sub1(&a, t); i = m = 0; k = 1; while(1) { if((m = m_div_ss(m, t, 239, &t)) > NMPA) break; if((m = m_div_ss(m, t, 239, &t)) > NMPA) break; if((k += 2) >= RADIX) { fprintf(stderr, "Error : Too long in pi()\n"); break; } while(i < m) u.num[i++] = 0; if(m_div_ss(m, t, k, &u) > NMPA) break; if(k & 2) m_add1(&a, u); else m_sub1(&a, u); } return a; } /* ln2 log(2) --> MPA */ MPA ln2(void) { MPA s, t, u, x; int k; x = m_div_s(_M1, 9); s = t = m_div_s(m_set_l(2L), 3); k = 3; while(s.exp - u.exp <= NMPA) { m_mul1(&t, x); u = m_div_s(t, k); m_add1(&s, u); k += 2; } s.sign = 1; return s; } /* ln625 log(.625) --> MPA */ MPA ln625(void) { MPA s, t, u, x; int k; x = m_div_s(m_set_l(9L), 169); s = t = m_div_s(m_set_l(-6L), 13); k = 3; while(s.exp - u.exp <= NMPA) { m_mul1(&t, x); u = m_div_s(t, k); m_add1(&s, u); k += 2; } return s; } /* ln75 log(.75) --> MPA */ MPA ln75(void) { MPA s, t, u, x; int k; x = m_inv(m_set_l(49L)); s = t = m_inv(m_set_a("-3.5")); k = 3; while(s.exp - u.exp <= NMPA) { m_mul1(&t, x); u = m_div_s(t, k); m_add1(&s, u); k += 2; } return s; } |