function xround = r8_roundx ( nplace, x )
%*****************************************************************************80
%
%% r8_roundx() rounds an R8.
%
% Discussion:
%
% Assume that the input quantity X has the form
%
% X = S * J * 10^L
%
% where S is plus or minus 1, L is an integer, and J is a decimal
% mantissa which is either exactly zero, or greater than or equal
% to 0.1 and less than 1.0.
%
% Then on return, XROUND will satisfy
%
% XROUND = S * K * 10^L
%
% where S and L are unchanged, and K is a decimal mantissa which
% agrees with J in the first NPLACE decimal digits and is zero
% thereafter.
%
% Note that because of rounding, most decimal fraction quantities
% cannot be stored exactly in the computer, and hence will have
% trailing "bogus" digits.
%
% If NPLACE is 0, XROUND will always be zero.
%
% If NPLACE is 1, the mantissa of XROUND will be 0, 0.1,
% 0.2, ..., or 0.9.
%
% If NPLACE is 2, the mantissa of XROUND will be 0, 0.01, 0.02,
% 0.03, ..., 0.98, 0.99.
%
% Licensing:
%
% This code is distributed under the GNU LGPL license.
%
% Modified:
%
% 22 October 2005
%
% Author:
%
% John Burkardt
%
% Input:
%
% integer NPLACE, the number of decimal digits to
% preserve. NPLACE should be 0 or positive.
%
% real X, the number to be decomposed.
%
% Output:
%
% real XROUND, the rounded value of X.
%
xround = 0.0;
%
% 1: Handle the special case of 0.
%
if ( x == 0.0 )
return
end
if ( nplace <= 0 )
return
end
%
% 2: Determine the sign IS.
%
if ( 0.0 < x )
is = 1;
xtemp = x;
else
is = -1;
xtemp = -x;
end
%
% 3: Force XTEMP to lie between 1 and 10, and compute the
% logarithm L.
%
l = 0;
while ( 10.0 <= x )
xtemp = xtemp / 10.0;
l = l + 1;
end
while ( xtemp < 1.0 )
xtemp = xtemp * 10.0;
l = l - 1;
end
%
% 4: Now strip out the digits of the mantissa as XMANT, and
% decrease L.
%
xmant = 0.0;
iplace = 0;
while ( true )
xmant = 10.0 * xmant;
if ( 1.0 <= xtemp )
xmant = xmant + floor ( xtemp );
xtemp = xtemp - floor ( xtemp );
end
iplace = iplace + 1;
if ( xtemp == 0.0 || nplace <= iplace )
xround = is * xmant * 10.0 ^ l;
break
end
l = l - 1;
xtemp = xtemp * 10.0;
end
return
end