=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/io/pexpr.c,v retrieving revision 1.23 retrieving revision 1.25 diff -u -p -r1.23 -r1.25 --- OpenXM_contrib2/asir2000/io/pexpr.c 2003/06/07 16:40:25 1.23 +++ OpenXM_contrib2/asir2000/io/pexpr.c 2003/12/02 06:56:48 1.25 @@ -44,7 +44,7 @@ * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. - * $OpenXM: OpenXM_contrib2/asir2000/io/pexpr.c,v 1.22 2003/05/29 16:45:01 saito Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/io/pexpr.c,v 1.24 2003/06/09 16:18:10 saito Exp $ */ #include "ca.h" #include "al.h" @@ -67,6 +67,7 @@ int hex_output; int fortran_output; int double_output; int real_digit; +int real_binary; int print_quote; #define TAIL @@ -395,7 +396,76 @@ Num q; case MID_PRINTF_G: #endif default: - if ( real_digit ) { + if ( real_binary ) { + unsigned int *m; + unsigned int u,l,mask; + int i,expo; + + m = (unsigned int *)&BDY((Real)q); +#if defined(__i386__) || defined(MIPSEL) || defined(VISUAL) || defined(__alpha) || defined(__FreeBSD__) || defined(__NetBSD__) + u = m[1]; l = m[0]; +#else + u = m[0]; l = m[1]; +#endif + if (u&0x80000000) { + TAIL PRINTF(OUT,"-"); + } + u &= 0x7fffffff; + expo = ((int)(u>>20)); + u &= 0xfffff; + if ( expo == 2047 ) { + if ( u || l ) { + TAIL PRINTF(OUT,"NaN"); + } else { + TAIL PRINTF(OUT,"Inf"); + } + } else if ( expo == 0 ) { + if ( u || l ) { + TAIL PRINTF(OUT,"0b0."); + for ( i = 0, mask = 0x80000; i < 20; + i++, mask >>= 1) { + TAIL + if ( u&mask ) + PRINTF(OUT,"1"); + else + PRINTF(OUT,"0"); + } + for ( i = 0, mask = 0x80000000; i < 32; + i++, mask >>= 1) { + TAIL + if ( l&mask ) + PRINTF(OUT,"1"); + else + PRINTF(OUT,"0"); + } + TAIL PRINTF(OUT,"*2^%d",-1022); + } else { + TAIL PRINTF(OUT,"0"); + } + } else { + expo -= 1023; + TAIL PRINTF(OUT,"0b1."); + for ( i = 0, mask = 0x80000; i < 20; + i++, mask >>= 1) { + TAIL + if ( u&mask ) + PRINTF(OUT,"1"); + else + PRINTF(OUT,"0"); + } + for ( i = 0, mask = 0x80000000; i < 32; + i++, mask >>= 1) { + TAIL + if ( l&mask ) + PRINTF(OUT,"1"); + else + PRINTF(OUT,"0"); + } + if ( expo ) { + TAIL PRINTF(OUT,"*2^%d",expo); + } + } + } else if ( real_digit ) { sprintf(real_format, double_output?"%%.%df":"%%.%dg",real_digit); TAIL PRINTF(OUT,real_format,BDY((Real)q)); @@ -416,13 +486,6 @@ Num q; case N_IP: case N_IntervalBigFloat: switch ( outputstyle ) { - case 0: - PUTS("["); - PRINTNUM(INF((Itv)q)); - PUTS(","); - PRINTNUM(SUP((Itv)q)); - PUTS("]"); - break; case 1: PUTS("intval("); PRINTNUM(INF((Itv)q)); @@ -430,6 +493,7 @@ Num q; PRINTNUM(SUP((Itv)q)); PUTS(")"); break; + case 0: default: PUTS("["); PRINTNUM(INF((Itv)q)); @@ -443,14 +507,11 @@ Num q; switch (printmode) { case PRINTF_E: switch ( outputstyle ) { - case 0: - TAIL PRINTF(OUT, "[%.16e,%.16e]", - INF((IntervalDouble)q),SUP((IntervalDouble)q)); - break; case 1: TAIL PRINTF(OUT, "intval(%.16e,%.16e)", INF((IntervalDouble)q),SUP((IntervalDouble)q)); break; + case 0: default: TAIL PRINTF(OUT, "[%.16e,%.16e]", INF((IntervalDouble)q),SUP((IntervalDouble)q)); @@ -463,16 +524,12 @@ Num q; break; case MID_PRINTF_G: switch ( outputstyle ) { - case 0: - TAIL PRINTF(OUT, "<%g,%g>", - (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5, - (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5); - break; case 1: TAIL PRINTF(OUT, "intvalm(%g,%g)", (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5, (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5); break; + case 0: default: TAIL PRINTF(OUT, "<%g,%g>", (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5, @@ -482,16 +539,12 @@ Num q; break; case MID_PRINTF_E: switch ( outputstyle ) { - case 0: - TAIL PRINTF(OUT, "<%.16e,%.16e>", - (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5, - (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5); - break; case 1: TAIL PRINTF(OUT, "intvalm(%.16e,%.16e)", (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5, (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5); break; + case 0: default: TAIL PRINTF(OUT, "<%.16e,%.16e>", (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5, @@ -502,14 +555,11 @@ Num q; case PRINTF_G: default: switch ( outputstyle ) { - case 0: - TAIL PRINTF(OUT, "[%g,%g]", - INF((IntervalDouble)q),SUP((IntervalDouble)q)); - break; case 1: TAIL PRINTF(OUT, "intval(%g,%g)", INF((IntervalDouble)q),SUP((IntervalDouble)q)); break; + case 0: default: TAIL PRINTF(OUT, "[%g,%g]", INF((IntervalDouble)q),SUP((IntervalDouble)q)); @@ -698,21 +748,15 @@ VECT vect; pointer *ptr; switch ( outputstyle ) { - case 0: - PUTS("[ "); - for ( i = 0, ptr = BDY(vect); i < vect->len; i++ ) { - PRINTEXPR(vl,ptr[i]); PUTS(" "); - } - PUTS("]"); - break; case 1: PUTS("vect("); for ( i = 0, ptr = BDY(vect); i < vect->len; i++ ) { - if ( i != 0 ) PUTS(", "); + if ( i != 0 ) PUTS(","); PRINTEXPR(vl,ptr[i]); } PUTS(")"); break; + case 0: default: PUTS("[ "); for ( i = 0, ptr = BDY(vect); i < vect->len; i++ ) { @@ -731,30 +775,20 @@ MAT mat; pointer *ptr; switch ( outputstyle ) { - case 0: - for ( i = 0, r = mat->row, c = mat->col; i < r; i++ ) { - PUTS("[ "); - for ( j = 0, ptr = BDY(mat)[i]; j < c; j++ ) { - PRINTEXPR(vl,ptr[j]); PUTS(" "); - } - PUTS("]"); - if ( i < r - 1 ) - PUTS("\n"); - } - break; case 1: PUTS("mat(\n"); for ( i = 0, r = mat->row, c = mat->col; i < r; i++ ) { if ( i != 0 ) PUTS(",\n"); PUTS("[ "); for ( j = 0, ptr = BDY(mat)[i]; j < c; j++ ) { - if ( j != 0 ) PUTS(", "); + if ( j != 0 ) PUTS(","); PRINTEXPR(vl,ptr[j]); } - PUTS("]"); + PUTS(" ]"); } PUTS(")"); break; + case 0: default: for ( i = 0, r = mat->row, c = mat->col; i < r; i++ ) { PUTS("[ ");