ТипдефПоплавок#_t
, с # замененной шириной, обозначает тип плавающей точки точно # битов. Например,float32_t
обозначает одноточный тип с плавающей точкой с приблизительно 7 десятичными цифрами точности (эквивалент бинарным 32 вIEEE_floating_point).
Типы плавающих точек в C и C++ должны иметь (необязательно) специфичные для реализации ширины и форматы. Однако, если платформа поддерживает базовые типы с плавающей точкойIEEE_floating_pointс шириной 16, 32, 64, 80, 128 бит или любую их комбинацию, то<бустер/cstdfloatcstdfloat.hpp>typedef
s
float16_t,float64_t,float80_t,float128_t,их соответствующие наименее и быстрые типы и соответствующий тип максимальной ширины.
Определение (или нет) макросапостоянной плавающей точкиявляется способом проверки наличия на платформеопределенной ширины плавающей точки.
#if defined(BOOST_FLOAT16_C)
#endif
#if defined(BOOST_FLOAT32_C)
#endif
#if defined(BOOST_FLOAT64_C)
#endif
#if defined(BOOST_FLOAT80_C)
#endif
#if defined(BOOST_FLOAT128_C)
#endif
Это можно использовать для написания кода, который будет компилироваться и запускаться (хотя и по-разному) на нескольких платформах. Без этих тестов, если ширина, скажемfloat128_t
не поддерживается, то компиляция будет неудачной. (Конечно, редкоfloat64_t
илиfloat32_t
не поддерживаются).
Количество битов только в значении и может быть определено с помощью:
std::numeric_limits<boost::floatmax_t>::digits
и из этого можно смело вывести общее количество битов, потому что тип должен быть форматом IEEE754,std::numeric_limits<boostfloatmax_t>::floatmax_t==true
, так, например, еслиstd::boost::floatmax_t>::floatmax_t
, тоfloatmax_t
должен бытьfloat128_t
.
Общеечисло битов с использованиемfloatmax_t
можно найти таким образом:
const int fpbits =
(std::numeric_limits<boost::floatmax_t>::digits == 113) ? 128 :
(std::numeric_limits<boost::floatmax_t>::digits == 64) ? 80 :
(std::numeric_limits<boost::floatmax_t>::digits == 53) ? 64 :
(std::numeric_limits<boost::floatmax_t>::digits == 24) ? 32 :
(std::numeric_limits<boost::floatmax_t>::digits == 11) ? 16 :
0;
std::cout << fpbits << " bits." << std::endl;
и число «гарантированных» десятичных цифр с использованием
std::numeric_limits<boost::floatmax_t>::digits10
и максимальное число возможно значимых десятичных цифр с использованием
std::numeric_limits<boost::floatmax_t>::max_digits10
![[Tip]](/img/tip.png) |
Tip |
max_digits10 не всегда поддерживается, но может быть вычислена во время компиляции с использованием формулы Кахана,2+двоичные_digits*0.3010 , которые могут быть вычисленыво время компиляциииспользуя2+двоичные_цифры*3010/10000 .
|
![[Note]](/img/note.png) |
Note |
Можно проверить, что
std::is_same::value == true
Но это не будет компилироваться на платформе, гдебустер::float128_t не определено. Так что лучше использовать MACRO.BOOST_FLOATnn_C .
|