|
Boost Users : |
Subject: Re: [Boost-users] converting to float128 from double
From: Cooper, Bridgette R D (b.cooper_at_[hidden])
Date: 2016-05-03 12:35:12
Hi John,
Thanks for the response.
Here are some more snippets from my code.
#include <boost/multiprecision/float128.hpp>
#include <boost/math/cstdfloat/cstdfloat_types.hpp>
#include <boost/math/cstdfloat/cstdfloat_limits.hpp>
#include <boost/math/cstdfloat/cstdfloat_cmath.hpp>
#include <boost/math/cstdfloat/cstdfloat_iostream.hpp>
#include <boost/multiprecision/detail/float_string_cvt.hpp>
#include <boost/multiprecision/detail/generic_interconvert.hpp>
extern "C"{
#include <quadmath.h>
}
#include <iostream>
#include <sstream>
#include <vector>
#include <iterator>
using namespace boost::multi precision;
double stieltjes_gamma(int num, const std::vector<double> & e8, const std::vector<double> & g8, int printlevel )
{
std::vector<float128> epoint(num), gpoint(num), bcoef(num);
for (int i=0; i < num; i++)
{
epoint.at(i)=(float128(e8.at(i)));
gpoint.at(i)=(float128(g8.at(i)));
}
bcoef.at(0)=0.0Q;
for (int i = 0; i < num; i++)
{
bcoef.at(0)+=gpoint.at(i)
}
std::cout << std::setprecision(std::numeric_limits<float128>::max_digits10) << bcoef.at(0)<< std::endl;
return(bcoef.at(0))
}
When I compare this to fortran code that does the same I don't see the same value for bcoef.at(0).
0.0345217724606016853085032291117978629 <- from above c++ code
3.452175962187407162907246287483402E-0002 <- Fortran correctly utilising quad precision on same input vector
The input vectors in this case are 7976 so errors in precision are really quickly apparrant. If I print the gpoint vector, it gets filled with the same garbage for additional precision from double as is for the fortran.
Thanks,
________________________________________
From: Boost-users <boost-users-bounces_at_[hidden]> on behalf of John Maddock <jz.maddock_at_[hidden]>
Sent: Tuesday, May 3, 2016 5:06:47 PM
To: boost-users_at_[hidden]
Subject: Re: [Boost-users] converting to float128 from double
On 03/05/2016 13:44, Cooper, Bridgette R D wrote:
>
> Hi,
>
>
> I have a function that takes as an argument a vector of doubles and
> tries to convert it to a vector of float128.
>
>
> When I accumulate the values in the float128 vector it looks like it
> does double additions and only casts up at the last step.
>
>
> The initial vector is defined as conststd::vector<double>
>
> The float128 vector is defined as std::vector<float128> epoint(num)
>
>
> And I try to do the casting (inside a loop) via:
> epoint.at(i)=(float128(e8.at(i)));
>
>
> If I do the accumulation on the original vector with no casting into a
> float128, I get the same as accumulating the vector that should be of
> float128 type.
>
>
> How should I be doing the casting?
>
Sorry but you'll have to post way more code than that to see where the
mistake is.
John.
>
> Thanks,
>
>
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
_______________________________________________
Boost-users mailing list
Boost-users_at_[hidden]
http://lists.boost.org/mailman/listinfo.cgi/boost-users
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net