Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Exact-Width Floating-Point typedefs

Boost , Math Toolkit 2.5.0 , Chapter 3. Specified-width floating-point typedefs

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

ТипдефПоплавок#_t, с # замененной шириной, обозначает тип плавающей точки точно # битов. Например,float32_tобозначает одноточный тип с плавающей точкой с приблизительно 7 десятичными цифрами точности (эквивалент бинарным 32 вIEEE_floating_point).

Типы плавающих точек в C и C++ должны иметь (необязательно) специфичные для реализации ширины и форматы. Однако, если платформа поддерживает базовые типы с плавающей точкойIEEE_floating_pointс шириной 16, 32, 64, 80, 128 бит или любую их комбинацию, то<бустер/cstdfloatcstdfloat.hpp>typedefsfloat16_t,float64_t,float80_t,float128_t,их соответствующие наименее и быстрые типы и соответствующий тип максимальной ширины.

How to tell which widths are supported

Определение (или нет) макросапостоянной плавающей точкиявляется способом проверки наличия на платформеопределенной ширины плавающей точки.

#if defined(BOOST_FLOAT16_C)
// Can use boost::float16_t, perhaps a proposed __short_float.
// P0192R1, Adding Fundamental Type for Short Float,
// Boris Fomitchev, Sergei Nikolaev, Olivier Giroux, Lawrence Crowl, 2016 Feb14
// http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2016.pdf
#endif
#if defined(BOOST_FLOAT32_C)
// Can use boost::float32_t, usually type `float`.
#endif
#if defined(BOOST_FLOAT64_C)
// Can use boost::float64_t, usually type `double`, and sometimes also type `long double`.
#endif
#if defined(BOOST_FLOAT80_C)
// Can use boost::float80_t, sometimes type `long double`.
#endif
#if defined(BOOST_FLOAT128_C)
// Can use boost::float128_t. Sometimes type `__float128` or `_Quad`.
#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; // Unknown - not IEEE754 format.
 std::cout << fpbits << " bits." << std::endl;

и число «гарантированных» десятичных цифр с использованием

std::numeric_limits<boost::floatmax_t>::digits10

и максимальное число возможно значимых десятичных цифр с использованием

std::numeric_limits<boost::floatmax_t>::max_digits10
[Tip] Tip

max_digits10не всегда поддерживается, но может быть вычислена во время компиляции с использованием формулы Кахана,2+двоичные_digits*0.3010, которые могут быть вычисленыво время компиляциииспользуя2+двоичные_цифры*3010/10000.

[Note] Note

Можно проверить, что

std::is_same::value == true

Но это не будет компилироваться на платформе, гдебустер::float128_tне определено. Так что лучше использовать MACRO.BOOST_FLOATnn_C.


PrevUpHomeNext

Статья Exact-Width Floating-Point typedefs раздела Math Toolkit 2.5.0 Chapter 3. Specified-width floating-point typedefs может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 3. Specified-width floating-point typedefs ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 05:07:32/0.0040810108184814/0