Happy New Year to all of you! Let us start the year with something for your inner maths nerd
For those of you who don’t yet know Rosetta Code: it is a real cool site where you can find lots of interesting code examples in all kinds of different languages for many different tasks. Of course R is also present big time (at the time of writing 426 code examples!): Rosetta Code for R.
The name of the site is inspired by the famous Rosetta Stone of Ancient Egypt which is inscribed with three different versions of the same text: in Ancient Egyptian hieroglyphs, Demotic script, and Ancient Greek script which proved invaluable in deciphering Egyptian hieroglyphs and thereby opening the window into ancient Egyptian history.
Now, a few days a ago I again added an example (for the other tasks I solved I will write more posts in the future, so stay tuned!). The task is to verify the correctness of Machin-like formulae using exact arithmetic.
A little bit of mathematical background is in order, so Wikipedia to the rescue:
Machin-like formulae are a popular technique for computing to a large number of digits. They are generalizations of John Machin]s formula from 1706:
which he used to compute to 100 decimal places. Machin-like formulae have the form
where and are positive integers such that , is a signed non-zero integer, and is a positive integer.
The exact task is to verify that the following Machin-like formulae are correct by calculating the value of tan (right hand side) for each equation using exact arithmetic and showing they equal one:
The same should be done for the last and most complicated case…
… but it should be confirmed that the following, slightly changed, formula is incorrect by showing tan (right hand side) is not one:
This is what I contributed to Rosetta Code:
As you can see all statements are TRUE
except for the last one!
In the code I make use of the Rmpfr
package (from Martin Maechler of ETH Zürich, Switzerland) which is based on the excellent GMP (GNU Multiple Precision) library. I define a new infix operator %:%
for high-precision division and after that convert all standard divisions in the formulae to high-precision divisions and calculate the tan. Before I check if the result is identical to one I round it to 100 decimal places which is more than enough given the precision of
, so about 300 decimal places, in the example.
Please let me know in the comments what you think of this approach and whether you see room for improvement for the code – Thank you!
Related