I am calculating the below formula: $$ \text{ER2}(\alpha,\text{K},\text{q})\text{:=}1+\sum _{m=0}^{K-1} \binom{K+\alpha }{m} \sum _{r=0}^m \frac{(-1)^r \binom{m}{r}}{\left(\frac{1}{q}\right)^{\alpha +K-m+r}-1}; $$ with the code:

ER2[α_, K_, q_] := 1 + Sum[Binomial[α + K, m] 
        r]*(-1)^r /((1/q)^(α + K + r - m) - 1), {r, 0, m}]
    , {m, 0, K - 1}];

when $\alpha=0,K=268,q=0.1$. The code produced a negative number -7306.51.
But I know the answer is positive! And Maple produce 3.196969869 as expected.
I think it's the matter of cancellation error, so I tried to use SetPrecision:

ER2PP = SetPrecision[ER2[α, K, q], 50];

Mathematica complaints:

NSum::nslim: Limit of summation -1.00000000000000000000000000000000000000000000000000000000000+K is not a number.

NSum::nslim: Limit of summation -1.00000000000000000000000000000000000000000000000000000000000+K is not a number.

NSum::nslim: Limit of summation -1.00000000000000000000000000000000000000000000000000000000000+K is not a number.

General::stop: Further output of NSum::nslim will be suppressed during this calculation.

Please help me to solve the problem, thanks!

  • 1
    $\begingroup$ Try ER2[0, 268, 1/10] // N. $\endgroup$ – b.gates.you.know.what Jan 21 '15 at 8:14
  • $\begingroup$ The error is due to the real number 0.1. I tried <code>ER2[0, 268, 0.1`40] // N</code>, and it also produce an positive number. But I still can't understand why it's failed to use SetPrecision... $\endgroup$ – robit Jan 21 '15 at 8:20
  • $\begingroup$ Sorry for the code format. I mean the code is ER2[0, 268, 0.1`40] // N. $\endgroup$ – robit Jan 21 '15 at 8:33
  • $\begingroup$ SetPrecision[exp,p], according to the documentation, "yields a version of expr in which all numbers have been set to have precision p." Thus, it probably changes integer indices to real numbers, which may cause problems. What I find curious is that including SetPrecision inside the definition of ER2, either around the outer Sum or the inner Sum, produces no error messages but also computes the wrong answer to high precision. $\endgroup$ – bbgodfrey Jan 21 '15 at 11:37
  • $\begingroup$ I noticed that the precision of ER2 itself is infinity. When substitute q with 0.1, the precision decreased. And maybe that's impossible to SetPrecision like such a summation due to the inner algorithms used by Mathematica. @bbgodfrey $\endgroup$ – robit Jan 22 '15 at 1:28

The only InexactNumberQ is $q=0.1$ so you have two options:

  1. replace it with 1/10 i.e. with Rationalize[0.1] i.e. SetPrecision[0.1, Infinity] if you want an exact answer and compute with exact numbers; you can later use N to get an approximation of the exact anser;

  2. replace it with SetPrecision[0.1, 50] i.e. 0.1`50 if you want to do the computation with 50 digits arbitrary precision numbers.

There is no need to use SetPrecision on the whole expression and this can cause problems with other exact number (for example a side effect of using inexact numbers as bounds in Sum is that NSum is used actually).

There is also a problem in your expression SetPrecision[ER2[...], 50] because SetPrecision act once ER2 has already computed the (wrong) result, i.e. SetPrecision is not HoldFirst. You can use Unevaluated.

ER2[α_, K_, q_] := 
  1 + Sum[Binomial[α + K, m] Sum[
      Binomial[m, r]*(-1)^r/((1/q)^(α + K + r - m) - 1), {r, 0,
        m}], {m, 0, K - 1}];
ER2[0, 268, 1/10] // N
ER2[0, 268, SetPrecision[0.1, 50]]
SetPrecision[Unevaluated@ER2[0, 268, 0.1], 50]

As you can see, placing SetPrecision in the right place pay off also in terms of precision of the result.


On 10.0 for Mac OS X x86 (64-bit) (December 4, 2014) and with the settings

α = 0; K = 268; q = 1/10;

all works fine:

ER2PP = SetPrecision[ER2[α, K, q], 50]


ER2[0, 268, 1/10] // Short

$\frac{133756473090706713\langle\langle 21765\rangle\rangle 656008497136924720}{418385153946357022\langle\langle 21764\rangle\rangle 593232363264815721}$




Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.