提升,在任意精度浮点和整数类型之间转换

时间:2015-08-25 19:31:01

标签: c++11 boost type-conversion arbitrary-precision

我完全不知道应该如何实现这一点,我大多设法让我的代码工作,直到我尝试在cpp_dec_float< 0>上运行ceil()。在仔细检查增强文档和谷歌搜索之后我会得出结论说我无法找到自己的答案,因此我转而向无限更有能力的程序员寻求帮助。

#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/math/special_functions/pow.hpp>
#include <boost/chrono/ceil.hpp>
#include <boost/multiprecision/number.hpp>

namespace mp = boost::multiprecision;
using namespace std;
using namespace boost::math;
using namespace boost::chrono;
using Int = mp::cpp_int;
Int reward(Int baseReward, int percent);

int main(int argc, char** argv)
{

    reward = calcReward(immBase, percent);
    return 0;
}

Int calcReward(Int baseReward, int percent)
{
    using Dec  = mp::number<mp::cpp_dec_float<0>>;
    Dec mult   = 0.1+0.01*percent;
    Dec five   = 5;
    Dec base   = baseReward.convert_to<Dec>();
    Int result = ceil(five*base*mult);

    return result;
}

这是从不必要的垃圾中剥离的代码,五个变量是一个肮脏的黑客,让它接受与任意精度浮点值的乘法(因为它只是决定说没有匹配的运算符*否则)。 这是相当令人困惑和非常令人沮丧的,ceil()。convert_to()也没有工作,并吐出一个任意的不可解密的错误。 (模板错误不可读)

这段代码在编译时确实需要-std = c ++ 11标志,这可能很明显。

1 个答案:

答案 0 :(得分:1)

通常的罪魁祸首是BMP表达的结果不是他们的目标类型,但仍然是&#34;懒惰&#34;表达式模板,他们没有所有隐式转换。所以,你需要手动评估这些&#34; (明确地):

return Dec(ceil(five*base*mult)).convert_to<Int>();

查看 Live On Coliru

#include <iostream>
#include <boost/multiprecision/detail/default_ops.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/math/special_functions/pow.hpp>
#include <boost/multiprecision/number.hpp>

namespace mp = boost::multiprecision;

using Int = mp::cpp_int;

Int calcReward(Int baseReward, int percent);

int main()
{
    Int const immBase = 400;
    int const percent = 12;

    std::cout << calcReward(immBase, percent);
}

Int calcReward(Int baseReward, int percent)
{
    using Dec  = mp::cpp_dec_float_50;
    Dec mult   = 0.1+0.01*percent;
    Dec five   = 5;
    Dec base   = baseReward.convert_to<Dec>();

    return Dec(ceil(five*base*mult)).convert_to<Int>();
}

注意: