[ 簡単な説明 ]
MPAライブラリの定数を定義するサブ・ヘッダー "mpa_v.h" の自動生成用プログラム。 本プログラムは、ライブラリの有効桁を変更し、ライブラリを再構築する際に実行します。 本プログラムの実行により生成されるファイルは、"mpa_v###.h"(### は、仮数部の配列要素数)で、"mpa_v.h" にリネームして使用します。 |
/* mak_vh.c make 'mpa_v###.h' file */ #include "mpa.h" /*#define DEBUG /* when debug, fp -> display */ void m_prt_v(char *s, MPA a, FILE *fp) { int i; UINT *p; fprintf(fp, "\nstatic MPA %s = {\n\t%5d,\t\t/* sign */\n", s, a.sign); fprintf(fp, "\t%5d,\t\t/* exp */\n", a.exp); fprintf(fp, "\t%5d,\t\t/* zero */\n\t", a.zero); for(i = 0, p = a.num; i < NMPA; i++) { fprintf(fp, "%5d,", *p++); if(i % 10 == 9) fprintf(fp, "\n\t"); } fprintf(fp, "%5d};\n", *p); return; } int main(void) { MPA a, b, c, d; char s[30]; double dn, w; long n; int i, k; FILE *fp; #ifndef DEBUG sprintf(s, "mpa_v%d.h\0", NMPA); fp = fopen(s, "a+t"); if(fp == NULL) { fprintf(stderr, "Error : File(%s) can't open in text mode.\n", s); exit(-1); } #else fp = stdout; #endif fprintf(fp, "/*\t\t%s\t\t< values of mpa >\t\t*/\n", s); fprintf(fp, "#ifndef\t\t_MPA_VF\n\n#define\t\t_MPA_VF\n"); d = pi(); m_prt_v("_E", e(), fp); m_prt_v("_PI", d, fp); m_prt_v("_2_PI", m_mul_s(d, 2), fp); m_prt_v("_PI_2", m_div_s(d, 2), fp); m_prt_v("_PI_4", m_div_s(d, 4), fp); m_prt_v("_SQRT3", m_sqrt(m_set_l(3L)), fp); b = m_sqrt(m_set_l(2L)); m_prt_v("_SQRT2", b, fp); m_prt_v("_1_SQRT2", m_inv(b), fp); b = ln2(); m_prt_v("_LN2", b, fp); a = m_add(ln625(), m_mul_s(b, 4)); m_prt_v("_LN10", a, fp); m_prt_v("_LNRADIX", m_mul_s(b, RADIXBITS), fp); m_prt_v("_LOG10_2", m_div(b, a), fp); m_prt_v("_LOG10_3", m_div(m_add(ln75(), m_mul_s(b, 2)), a), fp); c = d; b = m_sqr(d); k = 2; do { d = m_div_s(m_div_s(m_mul(d, b), k), k + 1); a = m_div_s(d, k + 1); k += 2; if(k & 2) m_add1(&c, a); else m_sub1(&c, a); } while(c.exp - a.exp < NMPA); m_prt_v("_G", c, fp); a.zero = 0; a.sign = 1; a.exp = MAXEXP; for(i = 0; i <= NMPA; i++) a.num[i] = RADIX1; m_prt_v("_MAX_M_EXP", m_log(a), fp); m_prt_v("_MAX_M_10", m_log10(a), fp); m_prt_v("_MMAX", a, fp); a.zero = 1; a.sign = 1; a.exp = 0; for(i = 0; i <= NMPA; i++) a.num[i] = 0; m_prt_v("_M0", a, fp); a.zero = 0; a.num[0] = 1; m_prt_v("_M1", a, fp); w = m_iset(_MAX_M_EXP) - 0.5 * log(2. * M_PI); n = 1; while(1) { dn = n + 1; if(w < (dn - 0.5) *log(dn) - dn) break; n++; } fprintf(fp, "\nstatic UINT _MAX_KAIJO = %ld;\n", --n); fprintf(fp, "\n#endif\n"); fclose(fp); return 1; } |