Page 1 of 1

High Precision FP - Prototyping MSVC

Posted: December 8th, 2012, 6:46 pm
by pcaspers
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

High Precision FP - Prototyping MSVC

Posted: December 8th, 2012, 7:50 pm
by Polter ... 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:

High Precision FP - Prototyping MSVC

Posted: December 9th, 2012, 10:42 am
by pcaspers
thanks very interesting indeed. And helpful.

Re: High Precision FP - Prototyping MSVC

Posted: December 27th, 2017, 12:30 pm
by Cuchulainn
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";