Serving the Quantitative Finance Community

 
User avatar
pcaspers
Topic Author
Posts: 30
Joined: June 6th, 2005, 9:49 am
Location: Germany

High Precision FP - Prototyping MSVC

December 8th, 2012, 6:46 pm

Hi,what is the easiest way to run existing c++ code in MSVC2010 with higher floating point precision than double ? I just want to see if it is worthwhile to move into that direction, so I do not want to change the compiler / use some external library.Any experience ?Thanks a lotPeter
 
User avatar
Polter
Posts: 1
Joined: April 29th, 2008, 4:55 pm

High Precision FP - Prototyping MSVC

December 8th, 2012, 7:50 pm

http://randomascii.wordpress.com/2012/0 ... ision/grep for 80 (as in 80-bit), extended (as in extended precision), long double, controlfp (as in _controlfp_s -- _PC_64 is the mask you're interested in), D3DCREATE_FPU_PRESERVEHere's a handy chart:
Last edited by Polter on December 7th, 2012, 11:00 pm, edited 1 time in total.
 
User avatar
pcaspers
Topic Author
Posts: 30
Joined: June 6th, 2005, 9:49 am
Location: Germany

High Precision FP - Prototyping MSVC

December 9th, 2012, 10:42 am

thanks very interesting indeed. And helpful.
 
User avatar
Cuchulainn
Posts: 20253
Joined: July 16th, 2004, 7:38 am
Location: 20, 000

Re: High Precision FP - Prototyping MSVC

December 27th, 2017, 12:30 pm

You can use Boost multiprecision. Here an example to compute [$]\pi[$].
BTW Archimedes of Syracuse probably invented Interval Arithmetic.

N, value: 20/3.141592653589662682701706171090774719985979379159334657412021084377287605362950884738001859546262235
 
Error: 3.9166728e-13
 
N, value: 40/3.141592653589793238462643264539730025868175440272163320532165222527356511645931880184364385214446692
 
Error: 3.5621932e-25
 
N, value: 60/3.141592653589793238462643383279502884089176205070734653848659243661099969287718976336684872480311458
 
Error: 3.2397958e-37
 
N, value: 80/3.14159265358979323846264338327950288419716939937500760173689723236079737032492766828422638159104739
 
Error: 2.9465771e-49
 
N, value: 100/3.141592653589793238462643383279502884197169399375105820974944502977939790038327551870396055373551631
 
Error: 2.6798963e-61
 
N, value: 120/3.141592653589793238462643383279502884197169399375105820974944592307816406204963949135527982537650455
 
Error: 2.4373515e-73
 
N, value: 140/3.141592653589793238462643383279502884197169399375105820974944592307816406286208998627960933400058354
 
Error: 2.2167583e-85
 
N, value: 160/3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117001
 
Error: 2.0161299e-97
 
N, value: 180/3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068
 
Error: 1.833314e-109
 
N, value: 200/3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068
 
Error: 3.6190453e-113
 
template <typename T>
 void ArchimedesPi(int N)
{ // N == number of iterations

 T three(3.0); T two(2.0);
 T an, anp1, bn, bnp1;
 an = 2.0*boost::multiprecision::sqrt(three); bn = T(three);

 for (int n = 1; n <= N; ++n)
 {
 // Take harmonic and geometric means
 anp1 = two*an*bn / (an + bn); 
 bnp1 = boost::multiprecision::sqrt(bn*anp1); 

 an = anp1; bn = bnp1;
 }

 std::cout << "N, value: " << std::setprecision(std::numeric_limits<T>::digits10)
 << N << "/" << bn << "\n\n";

 std::cout << "Error: " << std::setprecision(8)
 << boost::multiprecision::abs(bn - an) << "\n\n";
}