[ 簡単な説明 ]
第1引数の文字列はそのまま表示されます。 第3変数の _short は、短縮表示フラグで、0を指定すると、仮数部の10要素分(10進約45桁相当)のみを表示します。 0以外を指定すると全ての要素を表示します。 |
関数プロトタイプ | 機能説明 | |
void m_print(char *s, MPA a, int _short) | MPA 表示出力 | 10進表示 |
void m_printe(char *s, MPA a, int _short) | 指数部、仮数部別表示 | |
void m_prt_b(char *s, MPA a, int _short) | 要素内容表示 | |
void m_prt_m(char *s, MPA a, int _short) | 基数表示 |
/* m_print.c MPA print out in decimal */ #include "mpa.h" void m_print(char *s, MPA a, int _short) { int i, m, mmpa, mp, n, nmpa, zflag; UINT c[MMPA], t[NMPA1]; UINT *cp, *p, *q, w; ULONG u; nmpa = (_short)? 10: NMPA; mmpa = (_short)? 12: MMPA - 1; if(mmpa < fabs(a.exp)) { m_printe(s, a, _short); return; } if(a.zero == 1) { printf("%s 0\n", s); return; } printf("%s ", s); for(i = 0, cp = c; i <= mmpa; i++) *cp++ = 0; if(a.sign == 1) putchar('+'); else putchar('-'); cp = c; m = 0; n = a.exp; mp = -1; if(n >= 0) { for(i = 0, p = a.num, q = t; i <= n; i++) *q++ = *p++; while(1) { u = 0; for(i = 0, p = t; i <= n; i++) { u = (u << RADIXBITS) + *p; *p++ = u / 10000; u %= 10000; } *cp++ = u; m++; mp++; for(i = 0, p = t, zflag = 1; i <= n; i++) { if(*p++) { zflag = 0; break; } } if(zflag) break; } for(p = c, q = c + m - 1; p < q; p++, q--) { w = *p; *p = *q; *q = w; } for(i = n + 1, p = a.num, q = a.num + i; i <= nmpa; i++) *p++ = *q++; for(i = 0; i <= n; i++) *p++ = 0; a.exp = -1; } else if(n < -1) { while(1) { m_mul1_s(&a, 10000); if(a.exp < 0) mp--; else { *cp++ = a.num[0]; m++; break; } } for(i = 1, p = a.num, q = p + 1; i <= nmpa; i++) *p++ = *q++; *p = 0; a.exp = -1; } i = 0; m_mul1_s(&a, 10000); m++; if(a.exp == 0) { *cp++ = a.num[0]; a.num[0] = 0; } else *cp++ = 0; while(m <= mmpa) { if(m_z_chk(&a)) break; m_mul1_s(&a, 10000); *cp++ = a.num[0]; m++; a.num[0] = 0; } if(*(c + mmpa) < 5000) *(c + mmpa) = 0; else { *(c + mmpa) = 0; for(m = mmpa - 1, cp = c + m; m >= 0; m--) { (*cp)++; if(*cp != 10000) break; *cp-- = 0; } } for(cp = c + mmpa, p = c; cp >= p; ) { if(*cp--) break; mmpa--; } if(mmpa < 0) { printf("0\n"); return; } i = strlen(s) + 2; if(mp < 0) { printf("0."); while(++mp < 0) { if((i = (i + 5) % 78) < 5) { putchar('\n'); i = 5; } printf("0000 "); } mp = -1; } cp = c; if(mp < 0) printf("%04u ", *cp++); else { printf("%u", *cp++); if(mp) putchar(' '); else putchar('.'); } if((i = (i + 5) % 78) < 5) { putchar('\n'); i = 5; } for(m = 1; m <= mmpa; m++) { if((i = (i + 5) % 78) < 5) { putchar('\n'); i = 5; } printf("%04u", *cp++); if(m == mp) putchar('.'); else putchar(' '); } if(m < mp) { do { if((i = (i + 5) % 78) < 5) { putchar('\n'); i = 5; } printf("0000 "); }while(m++ < mp); } putchar('\n'); return; } void m_printe(char *s, MPA a, int _short) { MPA r, t; int ex; ex = a.exp; a.exp = 0; t = m_add(m_log(a), m_mul_s(_LNRADIX, ex)); t = m_idiv(t, _LN10, &r); printf("%s\n", s); printf("exponent(指数部) = %ld\n", m_iset_s(t)); printf("significant(仮数部) =\n"); m_print("", m_10(r), _short); } /* m_prt_b MPA print out in bit image */ void m_prt_b(char *s, MPA a, int _short) { int i, j, nmpa; UINT n, *p; nmpa = (_short)? 10: NMPA; puts(s); printf(" zero = %d sign = %d exp = %d\n", a.zero, a.sign, a.exp); for(i = 0, p = a.num; i < nmpa; i++) { for(j = 0, n = *p++; j < RADIXBITS; j++) { if((n <<= 1) & RADIX) putchar('1'); else putchar('0'); } putchar(' '); } putchar('\n'); return; } /* m_prt_m MPA print out in RADIX */ void m_prt_m(char *s, MPA a, int _short) { int flag, i, l, n, nn; UINT *p; printf("%s : ", s); printf("<%+5d> ", a.exp); if(a.zero) { printf("0\n"); return; } l = 15; nn = 60; if(a.sign == 1) putchar('+'); else putchar('-'); p = a.num; printf("%5u.", *p); n = nn; flag = 0; while(1) { *p++ = 0; if(m_z_chk(&a)) break; if(flag) for(i = 1; i <= l; i++) putchar(' '); printf(" %05u", *p); n -= 6; if(n >= 6) flag = 0; else { putchar('\n'); if(_short) return; flag = 1; n = nn; } } if(!flag) putchar('\n'); return; } |