Ja, gmp müsst schon 'ne Implementierung dafür haben, aber das nutzt mir nichts wenn ich 16 arctan(1/5) - 4 arctan(1/239) beim konvergieren gegen pi zusehen möchte.
Ich hab's mal so implementiert:
dStartTime = GetTime();
// make sure that strPi is different from strOldPi
// ...preliminary code and topic to change ;)
strPi[0] = 1; strOldPi[0] = 2;
strPi[1] = 0; strOldPi[1] = 0;
for(__int32 i = 0, z = 3; strcmp(strPi, strOldPi); i++, z += 2)
{
free(strPi);
free(strOldPi);
mpf_pow_ui(mpfC1, mpfX1, z);
mpf_pow_ui(mpfC2, mpfX2, z);
mpf_div_ui(mpfT1, mpfC1, z);
mpf_div_ui(mpfT2, mpfC2, z);
if(blnSign)
{
mpf_add(mpfArcTan1, mpfArcTan1, mpfT1);
mpf_add(mpfArcTan2, mpfArcTan2, mpfT2);
} else {
mpf_sub(mpfArcTan1, mpfArcTan1, mpfT1);
mpf_sub(mpfArcTan2, mpfArcTan2, mpfT2);
}
blnSign = !blnSign;
// Save old pi for comparison:
strOldPi = mpf_get_str(NULL, &eExp, 10, LONG_MAX, mpfPi);
mpf_mul_ui(mpfPP1, mpfArcTan1, 16);
mpf_mul_ui(mpfPP2, mpfArcTan2, 4);
mpf_sub(mpfPi, mpfPP1, mpfPP2);
strPi = mpf_get_str(NULL, &eExp, 10, LONG_MAX, mpfPi);
szPiLength = strlen(strPi);
szOldPiLength = strlen(strOldPi);
szOldLastPiPos = szLastPiPos;
for(szLastPiPos = szOldLastPiPos; szLastPiPos < szPiLength && szLastPiPos < szOldPiLength; szLastPiPos++)
if(strPi[szLastPiPos] != strOldPi[szLastPiPos]) break;
if(szLastPiPos)
{
printf("New digits found: %i\n", szLastPiPos - szOldLastPiPos);
for(p = szOldLastPiPos; p < szLastPiPos; p++)
{
printf("Digit %i: %c Elapsed time: %.3f\n", p, strPi[p], GetTime()-dStartTime);
}
}
}