繁体   English   中英

将int 128除数提高到浮点数

[英]boost int 128 division to floating point number

我是新来的。 我的项目中有128位整数(int128_t boost/multiprecision/cpp_int.hpp ),我需要将其除以浮点数。 在目前的平台上,我有限制,不能使用boost/multiprecision/float128.hpp 现在clang仍然不支持它https://github.com/boostorg/math/issues/181

通过boost math lib有什么办法吗?

也许将int128分成64位数字?

i128 = h64 *(1 << 64)+ l64然后,您可以轻松地加载这些值shift并将它们求和在64位浮点上求和以获得等效数字。

或者,由于浮点硬件实际上只有64位精度,因此您可以将int128向下移动,直到它适合64位,然后将其转换为浮点然后再向上移位,但是前者实际上可能会更快,因为更简单。

尽管您不能使用float128 ,但Boost具有长浮点类型的其他几种实现:

  • cpp_bin_float
  • cpp_dec_float
  • gmp_float
  • mpfr_float

特别是,如果您需要二进制高精度浮点类型而不依赖于GMP之类的外部库,则可以使用cpp_bin_float 例:

#include <iomanip>
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_bin_float.hpp>

int main()
{
    using LongFloat=boost::multiprecision::cpp_bin_float_quad;

    const auto x=boost::multiprecision::int128_t(1234123521);
    const auto y=LongFloat(34532.52346246234);
    const auto z=LongFloat(x)/y;
    std::cout << "Ratio: " << std::setprecision(10) << z << "\n";
}

在这里,我们为113位浮点数使用了内置的typedef,其精度和范围与IEEE 754 binary128相同。 您可以为精度和范围选择其他参数,有关详细信息,请参见上面链接到的文档。

不过请注意, int128_t比任何一种更精确float128 ,因为后者的某些位用于存放其指数。 如果这是一个问题,请确保使用更高的精度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM