Skip to content

Commit 2698be6

Browse files
committed
address review: better naming, some cleanup
1 parent c0a0c31 commit 2698be6

File tree

1 file changed

+31
-34
lines changed

1 file changed

+31
-34
lines changed

Python/bltinmodule.c

Lines changed: 31 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2524,32 +2524,33 @@ With an argument, equivalent to object.__dict__.");
25242524
*/
25252525

25262526
typedef struct {
2527-
double sum; /* accumulator */
2528-
double c; /* a running compensation for lost low-order bits */
2529-
} _csum;
2527+
double hi; /* high-order bits for a running sum */
2528+
double lo; /* a running compensation for lost low-order bits */
2529+
} CompensatedSum;
25302530

25312531
static inline void
2532-
_csum_neumaier_step(_csum *v, double x)
2532+
cs_add(CompensatedSum *v, double x)
25332533
{
2534-
double t = v->sum + x;
2535-
if (fabs(v->sum) >= fabs(x)) {
2536-
v->c += (v->sum - t) + x;
2534+
double t = v->hi + x;
2535+
if (fabs(v->hi) >= fabs(x)) {
2536+
v->lo += (v->hi - t) + x;
25372537
}
25382538
else {
2539-
v->c += (x - t) + v->sum;
2539+
v->lo += (x - t) + v->hi;
25402540
}
2541-
v->sum = t;
2541+
v->hi = t;
25422542
}
25432543

2544-
static inline void
2545-
_csum_neumaier_finalize(_csum *v)
2544+
static inline double
2545+
cs_to_double(CompensatedSum *v)
25462546
{
25472547
/* Avoid losing the sign on a negative result,
25482548
and don't let adding the compensation convert
25492549
an infinite or overflowed sum to a NaN. */
2550-
if (v->c && isfinite(v->c)) {
2551-
v->sum += v->c;
2550+
if (v->lo && isfinite(v->lo)) {
2551+
v->hi += v->lo;
25522552
}
2553+
return v->hi;
25532554
}
25542555

25552556
/*[clinic input]
@@ -2664,19 +2665,18 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start)
26642665
}
26652666

26662667
if (PyFloat_CheckExact(result)) {
2667-
_csum f_result = {PyFloat_AS_DOUBLE(result), 0.0};
2668+
CompensatedSum re_sum = {PyFloat_AS_DOUBLE(result)};
26682669
Py_SETREF(result, NULL);
26692670
while(result == NULL) {
26702671
item = PyIter_Next(iter);
26712672
if (item == NULL) {
26722673
Py_DECREF(iter);
26732674
if (PyErr_Occurred())
26742675
return NULL;
2675-
_csum_neumaier_finalize(&f_result);
2676-
return PyFloat_FromDouble(f_result.sum);
2676+
return PyFloat_FromDouble(cs_to_double(&re_sum));
26772677
}
26782678
if (PyFloat_CheckExact(item)) {
2679-
_csum_neumaier_step(&f_result, PyFloat_AS_DOUBLE(item));
2679+
cs_add(&re_sum, PyFloat_AS_DOUBLE(item));
26802680
_Py_DECREF_SPECIALIZED(item, _PyFloat_ExactDealloc);
26812681
continue;
26822682
}
@@ -2685,13 +2685,12 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start)
26852685
int overflow;
26862686
value = PyLong_AsLongAndOverflow(item, &overflow);
26872687
if (!overflow) {
2688-
f_result.sum += (double)value;
2688+
re_sum.hi += (double)value;
26892689
Py_DECREF(item);
26902690
continue;
26912691
}
26922692
}
2693-
_csum_neumaier_finalize(&f_result);
2694-
result = PyFloat_FromDouble(f_result.sum);
2693+
result = PyFloat_FromDouble(cs_to_double(&re_sum));
26952694
if (result == NULL) {
26962695
Py_DECREF(item);
26972696
Py_DECREF(iter);
@@ -2710,8 +2709,8 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start)
27102709

27112710
if (PyComplex_CheckExact(result)) {
27122711
Py_complex z = PyComplex_AsCComplex(result);
2713-
_csum cr_result = {z.real, 0.0};
2714-
_csum ci_result = {z.imag, 0.0};
2712+
CompensatedSum re_sum = {z.real};
2713+
CompensatedSum im_sum = {z.imag};
27152714
Py_SETREF(result, NULL);
27162715
while (result == NULL) {
27172716
item = PyIter_Next(iter);
@@ -2720,14 +2719,13 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start)
27202719
if (PyErr_Occurred()) {
27212720
return NULL;
27222721
}
2723-
_csum_neumaier_finalize(&cr_result);
2724-
_csum_neumaier_finalize(&ci_result);
2725-
return PyComplex_FromDoubles(cr_result.sum, ci_result.sum);
2722+
return PyComplex_FromDoubles(cs_to_double(&re_sum),
2723+
cs_to_double(&im_sum));
27262724
}
27272725
if (PyComplex_CheckExact(item)) {
27282726
z = PyComplex_AsCComplex(item);
2729-
_csum_neumaier_step(&cr_result, z.real);
2730-
_csum_neumaier_step(&ci_result, z.imag);
2727+
cs_add(&re_sum, z.real);
2728+
cs_add(&im_sum, z.imag);
27312729
Py_DECREF(item);
27322730
continue;
27332731
}
@@ -2736,22 +2734,21 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start)
27362734
int overflow;
27372735
value = PyLong_AsLongAndOverflow(item, &overflow);
27382736
if (!overflow) {
2739-
cr_result.sum += (double)value;
2740-
ci_result.sum += 0.0;
2737+
re_sum.hi += (double)value;
2738+
im_sum.hi += 0.0;
27412739
Py_DECREF(item);
27422740
continue;
27432741
}
27442742
}
27452743
if (PyFloat_Check(item)) {
27462744
double value = PyFloat_AS_DOUBLE(item);
2747-
cr_result.sum += value;
2748-
ci_result.sum += 0.0;
2745+
re_sum.hi += value;
2746+
im_sum.hi += 0.0;
27492747
_Py_DECREF_SPECIALIZED(item, _PyFloat_ExactDealloc);
27502748
continue;
27512749
}
2752-
_csum_neumaier_finalize(&cr_result);
2753-
_csum_neumaier_finalize(&ci_result);
2754-
result = PyComplex_FromDoubles(cr_result.sum, ci_result.sum);
2750+
result = PyComplex_FromDoubles(cs_to_double(&re_sum),
2751+
cs_to_double(&im_sum));
27552752
if (result == NULL) {
27562753
Py_DECREF(item);
27572754
Py_DECREF(iter);

0 commit comments

Comments
 (0)