11/* 
22 *  Mathlib : A C Library of Special Functions 
3-  *  Copyright (C) 2000-2019  The R Core Team 
3+  *  Copyright (C) 2000-2025  The R Core Team 
44 *  Copyright (C) 1998 Ross Ihaka 
55 * 
66 *  This program is free software; you can redistribute it and/or modify 
5757// R's  signif(x, digits)   via   Math2(args, fprec) in  ../main/arithmetic.c : 
5858double  fprec (double  x , double  digits )
5959{
60-     double  l10 , pow10 , sgn , p10 , P10 ;
61-     int  e10 , e2 , do_round , dig ;
62-     // Max.expon. of 10 (w/o denormalizing or overflow; = R's  trunc( log10(.Machine$double.xmax) ) 
63-     const  static  int  max10e  =  (int ) DBL_MAX_10_EXP ; // == 308 ("IEEE") 
64- 
6560    if  (ISNAN (x ) ||  ISNAN (digits ))
6661	return  x  +  digits ;
6762    if  (!R_FINITE (x )) return  x ;
6863    if  (!R_FINITE (digits )) {
69- 	if (digits  >  0.0  ) return  x ;
70- 	else  digits  =  1.0  ;
64+ 	if (digits  >  0. ) return  x ;
65+ 	else  digits  =  1. ;
7166    }
7267    if (x  ==  0 ) return  x ;
73-     dig  =  (int )round (digits );
68+ 
69+     int  dig  =  (int )round (digits );
7470    if  (dig  >  MAX_DIGITS ) {
7571	return  x ;
7672    } else  if  (dig  <  1 )
7773	dig  =  1 ;
7874
79-     sgn  =  1.0  ;
75+     double   sgn  =  1. ;
8076    if (x  <  0.0 ) {
8177	sgn  =  - sgn ;
8278	x  =  - x ;
8379    }
84-     l10  =  log10 (x );
85-     e10  =  (int )(dig - 1 - floor (l10 ));
80+     double  l10  =  log10 (x );
81+     int  e10  =  dig - 1  -  (int )floor (l10 );
82+     // Max.expon. of 10 (w/o denormalizing or overflow; = R's trunc( log10(.Machine$double.xmax) ): 
83+     const  static  int  max10e  =  (int ) DBL_MAX_10_EXP ; // == 308 ("IEEE") 
8684    if (fabs (l10 ) <  max10e  -  2 ) {
87- 	p10  =  1.0  ;
85+ 	double   p10  =  1. ;
8886	if (e10  >  max10e ) { /* numbers less than 10^(dig-1) * 1e-308 */ 
8987	    p10  =   R_pow_di (10. , e10 - max10e );
9088	    e10  =  max10e ;
9189	}
90+ 	double  pow10 ;
9291	if (e10  >  0 ) { /* Try always to have pow >= 1 
9392			 and so exactly representable */ 
9493	    pow10  =  R_pow_di (10. , e10 );
@@ -98,10 +97,13 @@ double fprec(double x, double digits)
9897	    return (sgn * (nearbyint ((x /pow10 ))* pow10 ));
9998	}
10099    } else  { /* -- LARGE or small -- */ 
101- 	do_round  =  max10e  -  l10 	 >= R_pow_di (10. , - dig );
102- 	e2  =  dig  +  ((e10 > 0 )? 1  : -1 ) *  MAX_DIGITS ;
103- 	p10  =  R_pow_di (10. , e2 );	x  *= p10 ;
104- 	P10  =  R_pow_di (10. , e10 - e2 );	x  *= P10 ;
100+ 	bool  do_round  =  log10 (DBL_MAX ) -  l10  >= R_pow_di (10. , - dig ); /* e.g. signif(1.09e308, 2) */ 
101+ 	int  e2  =  dig  +  ((e10  >  0 )? 1  : -1 ) *  MAX_DIGITS ;
102+ 	double 
103+ 	    p10  =  R_pow_di (10. , e2 ),
104+ 	    P10  =  R_pow_di (10. , e10 - e2 );
105+ 	x  *= p10 ;
106+ 	x  *= P10 ;
105107	/*-- p10 * P10 = 10 ^ e10 */ 
106108	if (do_round ) x  +=  0.5 ;
107109	x  =  floor (x ) / p10 ;
0 commit comments