Реализация<<boost/cstdfloat.hpp>>предназначена для использования<<float.h>>, определенного в стандарте C 1989 года. Препроцессор используется для запроса определенных определений препроцессора в<<float.h>>, таких как FLT_MAX, DBL_MAX и т. Д. По результатам этих запросов делается попытка автоматического обнаружения наличия встроенных типов плавающих точек, имеющих заданную ширину. Однозначный тест, требующий соответствияIEEE_floating_point(IEC599) на основе<std::numeric_limits<>::is_iec559>, выполняется с<BOOST_STATIC_ASSERT>.
Кроме того, эта реализация Boost<<boost/cstdfloat.hpp>>поддерживает 80-битную плавающую точку<typedef>, если она может быть обнаружена, и 128-битную плавающую точку<typedef>, если она может быть обнаружена, при условии, что базовые типы соответствуютIEEE-754 точному расширению(предоставленному<std::numeric_limits<>::is_iec559==true>для этого типа).
Заголовок<<boost/cstdfloat.hpp>>делает стандартизированную плавающую точку<typedef>безопасно доступной в<namespaceboost>без размещения каких-либо имен в<namespacestd>. Цель состоит в том, чтобы дополнять, а не конкурировать с потенциальным будущим C/C++. Стандартная библиотека, которая может содержать эти<typedef>. Если какой-то будущий стандарт C/C++ включает<<stdfloat.h>>и<<cstdfloat>>, то<<boost/cstdfloat.hpp>>будет продолжать функционировать, но станет избыточным и может быть безопасно обесценен.
Поскольку<<boost/cstdfloat.hpp>>является заголовком Boost, его название соответствует соглашениям об именах заголовков, а не C++. Стандартные библиотечные соглашения об именах.
Note
<<boost/cstdfloat.hpp>>не может синтезировать или создать<typedef>, если базовый тип не предусмотрен компилятором. Например, если компилятор не имеет базового типа с плавающей точкой с 128 битами (очень востребованными в научном и численном программировании), то<float128_t>и его соответствующие наименее и быстрые типы, а не, предоставленные<<boost/cstdfloat.hpp>>.
Warning
Если<<boost/cstdfloat.hpp>>использует нестандартизированный тип компилятора, а не, полученный из<float,double,>или<longdouble>, для одной или нескольких его плавающих точек<typedef>, то нет никакой гарантии, что специализации<numeric_limits<>>будут доступны для этих типов. Как правило, специализации<numeric_limits<>>будут доступны для этих типов, только если сам компилятор поддерживает соответствующие специализации для базового типа(ов), исключениями являются тип<__float128>GCC и тип<_Quad>Intel, которые явно поддерживаются через наш собственный код.
Warning
В качестве артефакта реализации некоторые макросы C из<<float.h>>могут быть видны пользователям<<boost/cstdfloat.hpp>>. Не полагайтесь на использование этих макросов; они не являются частью какого-либо интерфейса. Вместо этого используйте<std::numeric_limits<>>для диапазонов с плавающей запятой и т. Д.
Tip
Для достижения наилучших результатов<<boost/cstdfloat.hpp>>должен быть<#include>d перед другими заголовками, которые определяют общий код с использованием стандартных библиотечных функций, определенных в.
Это связано с тем, что<<boost/cstdfloat.hpp>>может определять перегрузки стандартных библиотечных функций, когда для одного из указанных типов ширины используется нестандартный тип (т.е. иной, чем<float>,<double>или<longdouble>). Если общий код (например, в другом заголовке Boost.Math) вызывает стандартную функцию библиотеки, то правильная перегрузка будет найдена только в том случае, если эти перегрузки определены до точки использования. Более подробно см.перегрузку шаблонных функций с помощью float128_tи реализацию<cstdfloat.hpp>.
По этой причине лучше всего<#include<boost/cstdfloat.hpp>>сначала включить.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.