[英]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.