#включает </мультиплексия/float128.hpp>
namespace boost{ namespace multiprecision{
class float128_backend;
typedef number<float128_backend, et_off> float128;
}}
Тип числа float128
представляет собой очень тонкую обертку вокруг типов данных GCC float128
или Intel _Quad
и обеспечивает тип реального числа, который является заменой для родных типов с плавающей точкой C++, но с 113-битной мантиссой и совместим с 128-битным QUAD FORTRAN.
Доступны все стандартные библиотеки и поддержка numeric_limits
, производительность должна быть эквивалентна базовым родным типам: например, бенчмарки LINPACK для GCC float128
и boost::multiprecision::float128
достигли 5,6 MFLOPS.
Как и обычные преобразования из арифметических и струнных типов, экземпляры float128
являются копируемыми и присваиваемыми из типов данных GCC float128
и Intel _Quad
.
Также можно получить доступ к базовому типу float128
или _Quad
через функцию data()
члена float128_backend
.
Что вы должны знать при использовании этого типа:
- По умолчанию построенные
float128
имеют значение ноль.
- Этот бэкэнд поддерживает rvalue-ссылки и является Move-Aware, делая инстанциации
номер
на этом бэкэнд-движении осведомленными.
- Невозможно переместить объекты этого типа в строку и обратно и получить точно такое же значение при компилировании с компилятором C++ Intel и использовании
_Quad
в качестве основного типа: это текущее ограничение нашего кода. Круглое спотыкание при использовании float128
в качестве базового типа возможно (как для GCC, так и для Intel).
- Преобразование из строки приводит к тому, что
std::runtime_error
выбрасывается, если строка не может быть интерпретирована как действительное число с плавающей точкой.
- Разделение на ноль приводит к бесконечности.
- Тип
float128
может использоваться как буквальный тип (поддержка Constexpr).
- При использовании компилятора Intel базовый тип по умолчанию
float128
, если он доступен, и _Quad
, если нет. Вы можете переопределить по умолчанию, определив либо BOOST_MP_USE_FLOAT128
, либо BOOST_MP_USE_QUAD
.
- Когда базовым типом является тип Intel
_Quad
, код должен быть составлен с помощью опции компилятора -Qoption,cpp,--extended_float_type
.
#include <boost/multiprecision/float128.hpp>
#include <boost/math/special_functions/gamma.hpp>
#include <iostream>
int main()
{
using namespace boost::multiprecision;
float128 b = 2;
std::cout << std::numeric_limits<float128>::digits << std::endl;
std::cout << std::numeric_limits<float128>::digits10 << std::endl;
std::cout << std::setprecision(std::numeric_limits<float128>::max_digits10)
<< log(b) << std::endl;
std::cout << boost::math::tgamma(b) << std::endl;
std::cout << boost::math::tgamma(float128(1000)) << std::endl;
constexpr float128 pi = 3.1415926535897932384626433832795028841971693993751058Q;
return 0;
}