mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 06:38:20 +00:00
Merge remote-tracking branch 'origin/topic/jsiwek/gh-1244-print-small-floating-point'
* origin/topic/jsiwek/gh-1244-print-small-floating-point: Omit unneeded decimal points in modp_dtoa2() scientific notation output GH-1244: Change modp_dtoa2() to use scientific notation for small values
This commit is contained in:
commit
82fb5722a1
6 changed files with 99 additions and 1 deletions
13
CHANGES
13
CHANGES
|
@ -1,3 +1,16 @@
|
|||
|
||||
4.1.0-dev.646 | 2021-05-18 11:47:25 -0700
|
||||
|
||||
* Omit unneeded decimal points in modp_dtoa2() scientific notation output (Jon Siwek, Corelight)
|
||||
|
||||
For example, "1e-13" is now used instead of "1.e-13".
|
||||
|
||||
* GH-1244: Change modp_dtoa2() to use scientific notation for small values (Jon Siwek, Corelight)
|
||||
|
||||
This fixes problems where printing floating point numbers less than
|
||||
10^-6 output as "0.0". Such numbers now use using scientific notation
|
||||
and preserve the value's actual floating point representation.
|
||||
|
||||
4.1.0-dev.643 | 2021-05-17 11:57:58 -0700
|
||||
|
||||
* GH-1546: Make DictIterator() public, add copy/move operators (Tim Wojtulewicz, Corelight)
|
||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
|||
4.1.0-dev.643
|
||||
4.1.0-dev.646
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
*/
|
||||
static const double _pow10[] = {1, 10, 100, 1000, 10000, 100000, 1000000,
|
||||
10000000, 100000000, 1000000000};
|
||||
static const double _pow10r[] = {1, .1, .01, .001, .0001, .00001, .000001,
|
||||
.0000001, .00000001, .000000001};
|
||||
|
||||
static void strreverse(char* begin, char* end)
|
||||
{
|
||||
|
@ -53,6 +55,7 @@ static void sn_strip_trailing_zeros(char* str)
|
|||
if ( ! frac )
|
||||
return;
|
||||
|
||||
char* start_dec = frac;
|
||||
char* exp = 0;
|
||||
char* trailing_zeros = 0;
|
||||
|
||||
|
@ -78,6 +81,9 @@ static void sn_strip_trailing_zeros(char* str)
|
|||
++frac;
|
||||
}
|
||||
|
||||
if ( trailing_zeros == start_dec )
|
||||
--trailing_zeros;
|
||||
|
||||
if ( trailing_zeros && exp )
|
||||
{
|
||||
for ( ; ; )
|
||||
|
@ -287,6 +293,14 @@ void modp_dtoa2(double value, char* str, int prec)
|
|||
prec = 9;
|
||||
}
|
||||
|
||||
double smallest = _pow10r[prec];
|
||||
|
||||
if (value != 0.0 && value < smallest) {
|
||||
sprintf(str, "%.*e", DBL_DECIMAL_DIG - 1, neg ? -value : value);
|
||||
sn_strip_trailing_zeros(str);
|
||||
return;
|
||||
}
|
||||
|
||||
int whole = (int) value;
|
||||
double tmp = (value - whole) * _pow10[prec];
|
||||
uint32_t frac = (uint32_t)(tmp);
|
||||
|
|
|
@ -91,6 +91,10 @@ void modp_dtoa(double value, char* buf, int precision);
|
|||
* will be switched exponential format and include as many precision digits
|
||||
* as needed to preserve information.
|
||||
*
|
||||
* If a non-zero input value is less than 10^(-precision), the output format
|
||||
* will be switched exponential format and include as many precision digits
|
||||
* as needed to preserve information.
|
||||
*
|
||||
* \param[in] value
|
||||
* \param[out] buf The allocated output buffer. Should be 32 chars or more.
|
||||
* \param[in] precision Number of digits to the right of the decimal point.
|
||||
|
|
|
@ -27,3 +27,35 @@ relational operator (PASS)
|
|||
relational operator (PASS)
|
||||
division operator (PASS)
|
||||
max double value = 1.7976931348623157e+308 (PASS)
|
||||
|
||||
4.9999999999999999e-13
|
||||
4.9999999999999997e-12
|
||||
5.0000000000000002e-11
|
||||
5.0000000000000003e-10
|
||||
5.0000000000000001e-09
|
||||
4.9999999999999998e-08
|
||||
4.9999999999999998e-07
|
||||
|
||||
0.000005
|
||||
0.00005
|
||||
0.0005
|
||||
0.005
|
||||
0.05
|
||||
0.5
|
||||
5.0
|
||||
|
||||
1e-13
|
||||
9.9999999999999998e-13
|
||||
9.9999999999999994e-12
|
||||
1e-10
|
||||
1.0000000000000001e-09
|
||||
1e-08
|
||||
9.9999999999999995e-08
|
||||
|
||||
0.000001
|
||||
0.00001
|
||||
0.0001
|
||||
0.001
|
||||
0.01
|
||||
0.1
|
||||
1.0
|
||||
|
|
|
@ -75,5 +75,40 @@ event zeek_init()
|
|||
local str1 = fmt("max double value = %.16e", d19);
|
||||
test_case( str1, str1 == "max double value = 1.7976931348623157e+308" );
|
||||
|
||||
# Printing small numbers: default precision is 6 with values smaller than
|
||||
# 10^-6 rendered in scientific notation, preserving exact floating point
|
||||
# representation.
|
||||
print "";
|
||||
print 0.0000000000005;
|
||||
print 0.000000000005;
|
||||
print 0.00000000005;
|
||||
print 0.0000000005;
|
||||
print 0.000000005;
|
||||
print 0.00000005;
|
||||
print 0.0000005;
|
||||
print "";
|
||||
print 0.000005;
|
||||
print 0.00005;
|
||||
print 0.0005;
|
||||
print 0.005;
|
||||
print 0.05;
|
||||
print 0.5;
|
||||
print 5.0;
|
||||
print "";
|
||||
print 0.0000000000001;
|
||||
print 0.000000000001;
|
||||
print 0.00000000001;
|
||||
print 0.0000000001;
|
||||
print 0.000000001;
|
||||
print 0.00000001;
|
||||
print 0.0000001;
|
||||
print "";
|
||||
print 0.000001;
|
||||
print 0.00001;
|
||||
print 0.0001;
|
||||
print 0.001;
|
||||
print 0.01;
|
||||
print 0.1;
|
||||
print 1.0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue