The R Project SVN R

Rev

Rev 35251 | Rev 39481 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 35251 Rev 35253
Line 211... Line 211...
211
	*kpower = kp;
211
	*kpower = kp;
212
 
212
 
213
	/* compute number of digits */
213
	/* compute number of digits */
214
 
214
 
215
	*nsig = R_print.digits;
215
	*nsig = R_print.digits;
216
	for (j=1; j <= *nsig; j++) {
216
	for (j = 1; j <= *nsig; j++) {
217
	    if (fabs(alpha - floor(alpha+0.5)) < eps * alpha) {
217
	    if (fabs(alpha - floor(alpha+0.5)) < eps * alpha) {
218
		*nsig = j;
218
		*nsig = j;
219
		break;
219
		break;
220
	    }
220
	    }
221
	    alpha *= 10.0;
221
	    alpha *= 10.0;
Line 225... Line 225...
225
 
225
 
226
/* 
226
/* 
227
   The return values are
227
   The return values are
228
     w : the required field width
228
     w : the required field width
229
     d : use %w.df in fixed format, %#w.de in scientific format
229
     d : use %w.df in fixed format, %#w.de in scientific format
230
     e : use scientific format if != 0
230
     e : use scientific format if != 0, value is number of exp digits - 1
231
 
231
 
232
   nsmall specifies the minimum number of decimal digits in fixed format:
232
   nsmall specifies the minimum number of decimal digits in fixed format:
233
   it is 0 except when called from do_format.  
233
   it is 0 except when called from do_format.  
234
*/
234
*/
235
 
235
 
Line 281... Line 281...
281
     * If the additional exponent digit is required *e is set to 2
281
     * If the additional exponent digit is required *e is set to 2
282
     */
282
     */
283
 
283
 
284
    /*-- These	'mxsl' & 'rgt'	are used in F Format
284
    /*-- These	'mxsl' & 'rgt'	are used in F Format
285
     *	 AND in the	____ if(.) "F" else "E" ___   below: */
285
     *	 AND in the	____ if(.) "F" else "E" ___   below: */
286
    if (mxl < 0) mxsl = 1 + neg;
286
    if (mxl < 0) mxsl = 1 + neg;  /* we use %#w.dg, so have leading zero */ 
287
 
287
 
288
    /* use nsmall only *after* comparing "F" vs "E": */
288
    /* use nsmall only *after* comparing "F" vs "E": */
289
    if (rgt < 0) rgt = 0;
289
    if (rgt < 0) rgt = 0;
290
    wF = mxsl + rgt + (rgt != 0);	/* width for F format */
290
    wF = mxsl + rgt + (rgt != 0);	/* width for F format */
291
 
291
 
Line 310... Line 310...
310
    if (posinf && *w < 3) *w = 3;
310
    if (posinf && *w < 3) *w = 3;
311
    if (neginf && *w < 4) *w = 4;
311
    if (neginf && *w < 4) *w = 4;
312
}
312
}
313

313

314
 
314
 
-
 
315
/* As from 2.2.0 the number of digits applies to real and imaginary parts
-
 
316
   together, not separately */
-
 
317
void z_prec_r(Rcomplex *r, Rcomplex *x, double digits);
-
 
318
 
315
void formatComplex(Rcomplex *x, int n, int *wr, int *dr, int *er,
319
void formatComplex(Rcomplex *x, int n, int *wr, int *dr, int *er,
316
		   int *wi, int *di, int *ei, int nsmall)
320
		   int *wi, int *di, int *ei, int nsmall)
317
{
321
{
318
/* format.info() or  x[1..l] for both Re & Im */
322
/* format.info() or  x[1..l] for both Re & Im */
319
    int left, right, sleft;
323
    int left, right, sleft;
320
    int rt, mnl, mxl, mxsl, mxns, wF;
324
    int rt, mnl, mxl, mxsl, mxns, wF, i_wF;
321
    int i_rt, i_mnl, i_mxl, i_mxsl, i_mxns;
325
    int i_rt, i_mnl, i_mxl, i_mxsl, i_mxns;
322
    int neg, sgn;
326
    int neg, sgn;
323
    int i, kpower, nsig;
327
    int i, kpower, nsig;
324
    int naflag;
328
    int naflag;
325
    int rnanflag, rposinf, rneginf, inanflag, iposinf;
329
    int rnanflag, rposinf, rneginf, inanflag, iposinf;
-
 
330
    Rcomplex tmp;
-
 
331
    Rboolean all_re_zero = TRUE, all_im_zero = TRUE;
326
 
332
 
327
    double eps = pow(10.0, -(double)R_print.digits);
333
    double eps = pow(10.0, -(double)R_print.digits);
328
 
334
 
329
    naflag = 0;
335
    naflag = 0;
330
    rnanflag = 0;
336
    rnanflag = 0;
Line 337... Line 343...
337
    rt	=  mxl =  mxsl =  mxns = INT_MIN;
343
    rt	=  mxl =  mxsl =  mxns = INT_MIN;
338
    i_rt= i_mxl= i_mxsl= i_mxns= INT_MIN;
344
    i_rt= i_mxl= i_mxsl= i_mxns= INT_MIN;
339
    i_mnl = mnl = INT_MAX;
345
    i_mnl = mnl = INT_MAX;
340
 
346
 
341
    for (i = 0; i < n; i++) {
347
    for (i = 0; i < n; i++) {
-
 
348
	/* Now round */
-
 
349
	z_prec_r(&tmp, &(x[i]), R_print.digits);
342
	if(ISNA(x[i].r) || ISNA(x[i].i)) {
350
	if(ISNA(tmp.r) || ISNA(tmp.i)) {
343
	    naflag = 1;
351
	    naflag = 1;
344
	} else {
352
	} else {
345
	    /* real part */
353
	    /* real part */
346
 
354
 
347
	    if(!R_FINITE(x[i].r)) {
355
	    if(!R_FINITE(tmp.r)) {
348
		if (ISNAN(x[i].r)) rnanflag = 1;
356
		if (ISNAN(tmp.r)) rnanflag = 1;
349
		else if (x[i].r > 0) rposinf = 1;
357
		else if (tmp.r > 0) rposinf = 1;
350
		else rneginf = 1;
358
		else rneginf = 1;
351
	    } else {
359
	    } else {
-
 
360
		if(tmp.r != 0) all_re_zero = FALSE;
352
		scientific(&(x[i].r), &sgn, &kpower, &nsig, eps);
361
		scientific(&(tmp.r), &sgn, &kpower, &nsig, eps);
353
 
362
 
354
		left = kpower + 1;
363
		left = kpower + 1;
355
		sleft = sgn + ((left <= 0) ? 1 : left); /* >= 1 */
364
		sleft = sgn + ((left <= 0) ? 1 : left); /* >= 1 */
356
		right = nsig - left; /* #{digits} right of '.' ( > 0 often)*/
365
		right = nsig - left; /* #{digits} right of '.' ( > 0 often)*/
357
		if (sgn) neg = 1; /* if any < 0, need extra space for sign */
366
		if (sgn) neg = 1; /* if any < 0, need extra space for sign */
Line 366... Line 375...
366
	    /* imaginary part */
375
	    /* imaginary part */
367
 
376
 
368
	    /* this is always unsigned */
377
	    /* this is always unsigned */
369
	    /* we explicitly put the sign in when we print */
378
	    /* we explicitly put the sign in when we print */
370
 
379
 
371
	    if(!R_FINITE(x[i].i)) {
380
	    if(!R_FINITE(tmp.i)) {
372
		if (ISNAN(x[i].i)) inanflag = 1;
381
		if (ISNAN(tmp.i)) inanflag = 1;
373
		else iposinf = 1;
382
		else iposinf = 1;
374
	    } else {
383
	    } else {
-
 
384
		if(tmp.i != 0) all_im_zero = FALSE;
375
		scientific(&(x[i].i), &sgn, &kpower, &nsig, eps);
385
		scientific(&(tmp.i), &sgn, &kpower, &nsig, eps);
376
 
386
 
377
		left = kpower + 1;
387
		left = kpower + 1;
378
		sleft = ((left <= 0) ? 1 : left);
388
		sleft = ((left <= 0) ? 1 : left);
379
		right = nsig - left;
389
		right = nsig - left;
380
 
390
 
Line 399... Line 409...
399
 
409
 
400
	if (mxl > 100 || mnl < -99) *er = 2;
410
	if (mxl > 100 || mnl < -99) *er = 2;
401
	else *er = 1;
411
	else *er = 1;
402
	*dr = mxns - 1;
412
	*dr = mxns - 1;
403
	*wr = neg + (*dr > 0) + *dr + 4 + *er;
413
	*wr = neg + (*dr > 0) + *dr + 4 + *er;
404
        if (wF <= *wr + R_print.scipen) { /* Fixpoint if it needs less space */
-
 
405
	    *er = 0;
-
 
406
	    if (nsmall > rt) {
-
 
407
		rt = nsmall;
-
 
408
		wF = mxsl + rt + (rt != 0);
-
 
409
	    }
-
 
410
	    *dr = rt;
-
 
411
	    *wr = wF;
-
 
412
	}
-
 
413
    } else {
414
    } else {
414
	*er = 0;
415
	*er = 0;
415
	*wr = 0;
416
	*wr = 0;
416
	*dr = 0;
417
	*dr = 0;
-
 
418
	wF = 0;
417
    }
419
    }
418
    if (rnanflag && *wr < 3) *wr = 3;
-
 
419
    if (rposinf && *wr < 3) *wr = 3;
-
 
420
    if (rneginf && *wr < 4) *wr = 4;
-
 
421
 
420
 
422
    /* overall format for imaginary part */
421
    /* overall format for imaginary part */
423
 
422
 
424
    if (i_mxl != INT_MIN) {
423
    if (i_mxl != INT_MIN) {
425
	if (i_mxl < 0) i_mxsl = 1;
424
	if (i_mxl < 0) i_mxsl = 1;
426
	if (i_rt < 0) i_rt = 0;
425
	if (i_rt < 0) i_rt = 0;
427
	wF = i_mxsl + i_rt + (i_rt != 0);
426
	i_wF = i_mxsl + i_rt + (i_rt != 0);
428
 
427
 
429
	if (i_mxl > 100 || i_mnl < -99) *ei = 2;
428
	if (i_mxl > 100 || i_mnl < -99) *ei = 2;
430
	else *ei = 1;
429
	else *ei = 1;
431
	*di = i_mxns - 1;
430
	*di = i_mxns - 1;
432
	*wi = (*di > 0) + *di + 4 + *ei;
431
	*wi = (*di > 0) + *di + 4 + *ei;
433
        if (wF <= *wi + R_print.scipen) { /* Fixpoint if it needs less space */
-
 
434
	    *ei = 0;
-
 
435
	    if (nsmall > i_rt) {
-
 
436
		i_rt = nsmall;
-
 
437
		wF = mxsl + i_rt + (i_rt != 0);
-
 
438
	    }
-
 
439
	    *di = i_rt;
-
 
440
	    *wi = wF;
-
 
441
	}
-
 
442
    } else {
432
    } else {
443
	*ei = 0;
433
	*ei = 0;
444
	*wi = 0;
434
	*wi = 0;
445
	*di = 0;
435
	*di = 0;
-
 
436
	i_wF = 0;
446
    }
437
    }
-
 
438
 
-
 
439
    /* Now make the fixed/scientific decision */
-
 
440
    if(all_re_zero) {
-
 
441
	*er = *dr = 0;
-
 
442
	*wr = wF;
-
 
443
	if (i_wF <= *wi + R_print.scipen) {
-
 
444
	    *ei = 0;
-
 
445
	    if (nsmall > i_rt) {i_rt = nsmall; i_wF = i_mxsl + i_rt + (i_rt != 0);}
-
 
446
	    *di = i_rt;
-
 
447
	    *wi = i_wF;
-
 
448
	}    
-
 
449
    } else if(all_im_zero) {
-
 
450
	if (wF <= *wr + R_print.scipen) {
-
 
451
	    *er = 0;
-
 
452
	    if (nsmall > rt) {rt = nsmall; wF = mxsl + rt + (rt != 0);}
-
 
453
	    *dr = rt;
-
 
454
	    *wr = wF;
-
 
455
	    }	
-
 
456
	*ei = *di = 0;
-
 
457
	*wi = i_wF;
-
 
458
    } else if(wF + i_wF < *wr + *wi + 2*R_print.scipen) {
-
 
459
	    *er = 0;
-
 
460
	    if (nsmall > rt) {rt = nsmall; wF = mxsl + rt + (rt != 0);}
-
 
461
	    *dr = rt;
-
 
462
	    *wr = wF;
-
 
463
 
-
 
464
	    *ei = 0;
447
    if (inanflag && *wi < 3) *wi = 3;
465
	    if (nsmall > i_rt) {
-
 
466
		i_rt = nsmall; 
-
 
467
		i_wF = i_mxsl + i_rt + (i_rt != 0);
-
 
468
	    }
-
 
469
	    *di = i_rt;
-
 
470
	    *wi = i_wF;
448
    if (iposinf  && *wi < 3) *wi = 3;
471
    } /* else scientific for both */
449
    if(*wr < 0) *wr = 0;
472
    if(*wr < 0) *wr = 0;
450
    if(*wi < 0) *wi = 0;
473
    if(*wi < 0) *wi = 0;
451
 
474
 
-
 
475
    /* Ensure space for Inf and NaN */
-
 
476
    if (rnanflag && *wr < 3) *wr = 3;
-
 
477
    if (rposinf && *wr < 3) *wr = 3;
-
 
478
    if (rneginf && *wr < 4) *wr = 4;
-
 
479
    if (inanflag && *wi < 3) *wi = 3;
-
 
480
    if (iposinf  && *wi < 3) *wi = 3;
-
 
481
 
452
    /* finally, ensure that there is space for NA */
482
    /* finally, ensure that there is space for NA */
453
 
483
 
454
    if (naflag && *wr+*wi+2 < R_print.na_width)
484
    if (naflag && *wr+*wi+2 < R_print.na_width)
455
	*wr += (R_print.na_width -(*wr + *wi + 2));
485
	*wr += (R_print.na_width -(*wr + *wi + 2));
456
}
486
}