Velocity Reviews > Significant Digits (Significant Figures)

# Significant Digits (Significant Figures)

SMH
Guest
Posts: n/a

 01-07-2007

Anyone found any mature/well-tested code that actually produces
significant figures for any real number result of an arithmetic operation,
of course represented as a string.

This is code I developed some time ago, but I don't think all the bugs
have been worked out or that all the logic is sound, given the criteria
for determining significant digits.

======= begin code ========

/* Two functions are defined:

1. getSigDigits() is supposed to return to the caller the
count of significant digits of the argument passed to it.

The function takes a single argument of type string or number.
If passed a string, it uses regular expressions to attempt
to find the count of signficant digits.
If passed a number, it renders the number to a string
represented by the toExponential() method and then uses
a regular expression to attempt to analyze the mantissa.

2. setSigDigits() is supposed to return to the caller a number
properly formatted (and rounded) represented as a string
with the proper significant digits.

It takes two arguments:
(i) parameter #1 is the value to be adjusted/formatted, and
can be of type string or number (limited argument checking
is done; and could probaby be improved)
(ii) parameter #2 is the count of significant digits to use
to format the value; more extensive argument checking is
done to make sure it is a positive integer, and a default
is applied if there is a range or type error.

The function essentially attempts to obtain a mantissa
of a number that might be expressed in scientific notation,
to which rounding is applied in the case of truncation or
to which the number is extended with zeroes.

The idea would be to determine the count of significant
digits on each operand in an arithmetic operation using
getSigDigits(), producing the answer/result, and then
formatting the answer with setSigDigits().

*/

function getSigDigits(value)
{
var result;
if (typeof(value) == "string")
{
var sigdigs = 0;
result = value.match(/(\d+)\.?(\d*)|(\d*)\.?(\d+)/);
if (result[1] != null || results[2] != null)
{
sigdigs += results[1] ? result[1].length : 0;
sigdigs += results[2] ? result[2].length : 0;
return (sigdigs);
}
sigdigs += results[3] ? result[3].length : 0;
sigdigs += results[4] ? result[4].length : 0;
return (sigdigs);
}
else if (typeof(value) != "number")
return (null);
if ((result = value.toExponential().match
(/[eE]{1}[+\-]?\d{1,3}/)) == null)
return (null);
return (result[1].length);
}

function setSigDigits(value, digits)
{
if (typeof(value) == "undefined" || value == null)
return (null);
var exp, val;
if (isNaN(digits) == true || digits <= 0)
digits = 6;
var sign = 1;
if (value != 0.0)
{
var sign = 1;
if (value < 0)
{
sign = -1;
value = Math.abs(value);
}
val = log10(value);
val -= (exp = Math.floor(val)) - 7;
val = Math.round(Math.pow(10, val));
val = Math.pow(10, log10(val) - 7 + exp);
val *= sign;
}
else
val = value;
val = new String(val);
if (val.search(/\./) > digits)
val = val.substr(0, digits);
else
val = val.substr(0, digits + 1);
return (val);
}

======= end code ========

 Thread Tools

 Posting Rules You may not post new threads You may not post replies You may not post attachments You may not edit your posts BB code is On Smilies are On [IMG] code is On HTML code is OffTrackbacks are On Pingbacks are On Refbacks are Off Forum Rules

 Similar Threads Thread Thread Starter Forum Replies Last Post a01lida VHDL 2 11-16-2008 12:28 PM Jonny C++ 6 10-10-2005 05:16 PM mrstephengross Python 29 05-23-2005 02:50 AM David Corby C++ 8 05-02-2004 05:34 AM pw C++ 2 06-29-2003 11:18 AM

Advertisments