MPAライブラリ 出力ルーチン



[ 簡単な説明 ]

第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")           top (トップに戻る)
/*		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;
}