summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
authorAllan Haldane <allan.haldane@gmail.com>2018-03-09 14:53:19 -0500
committerAllan Haldane <allan.haldane@gmail.com>2018-03-09 15:02:40 -0500
commit4193d30d850e94f0ab2bd03016f3a3353dd9da4b (patch)
tree9b30d0b350bdec615d3aaf7a62144a340467d31f /numpy
parent96684909b41c240a5ad8039393720d8bd9fc5ece (diff)
downloadnumpy-4193d30d850e94f0ab2bd03016f3a3353dd9da4b.tar.gz
BUG: dragon4 fractional output mode adds too many trailing zeros
Fixes #10713
Diffstat (limited to 'numpy')
-rw-r--r--numpy/core/src/multiarray/dragon4.c16
-rw-r--r--numpy/core/tests/test_scalarprint.py2
2 files changed, 13 insertions, 5 deletions
diff --git a/numpy/core/src/multiarray/dragon4.c b/numpy/core/src/multiarray/dragon4.c
index e256b0ad7..e005234a0 100644
--- a/numpy/core/src/multiarray/dragon4.c
+++ b/numpy/core/src/multiarray/dragon4.c
@@ -1588,12 +1588,12 @@ FormatPositional(char *buffer, npy_uint32 bufferSize, npy_uint64 mantissa,
npy_int32 digits_right)
{
npy_int32 printExponent;
- npy_int32 numDigits, numWholeDigits, has_sign=0;
+ npy_int32 numDigits, numWholeDigits=0, has_sign=0;
npy_int32 maxPrintLen = (npy_int32)bufferSize - 1, pos = 0;
/* track the # of digits past the decimal point that have been printed */
- npy_int32 numFractionDigits = 0;
+ npy_int32 numFractionDigits = 0, desiredFractionalDigits;
DEBUG_ASSERT(bufferSize > 0);
@@ -1711,6 +1711,11 @@ FormatPositional(char *buffer, npy_uint32 bufferSize, npy_uint64 mantissa,
buffer[pos++] = '.';
}
+ desiredFractionalDigits = precision;
+ if (cutoff_mode == CutoffMode_TotalLength && precision >= 0) {
+ desiredFractionalDigits = precision - numWholeDigits;
+ }
+
if (trim_mode == TrimMode_LeaveOneZero) {
/* if we didn't print any fractional digits, add a trailing 0 */
if (numFractionDigits == 0 && pos < maxPrintLen) {
@@ -1719,11 +1724,12 @@ FormatPositional(char *buffer, npy_uint32 bufferSize, npy_uint64 mantissa,
}
}
else if (trim_mode == TrimMode_None &&
- digit_mode != DigitMode_Unique &&
- precision > numFractionDigits && pos < maxPrintLen) {
+ digit_mode != DigitMode_Unique &&
+ desiredFractionalDigits > numFractionDigits &&
+ pos < maxPrintLen) {
/* add trailing zeros up to precision length */
/* compute the number of trailing zeros needed */
- npy_int32 count = precision - numFractionDigits;
+ npy_int32 count = desiredFractionalDigits - numFractionDigits;
if (pos + count > maxPrintLen) {
count = maxPrintLen - pos;
}
diff --git a/numpy/core/tests/test_scalarprint.py b/numpy/core/tests/test_scalarprint.py
index 164ab06c7..d57f1a890 100644
--- a/numpy/core/tests/test_scalarprint.py
+++ b/numpy/core/tests/test_scalarprint.py
@@ -152,6 +152,8 @@ class TestRealScalars(object):
assert_equal(fpos64('1.5', unique=False, precision=3), "1.500")
assert_equal(fsci32('1.5', unique=False, precision=3), "1.500e+00")
assert_equal(fsci64('1.5', unique=False, precision=3), "1.500e+00")
+ # gh-10713
+ assert_equal(fpos64('324', unique=False, precision=5, fractional=False), "324.00")
def test_dragon4_interface(self):
tps = [np.float16, np.float32, np.float64]