Похоже, что __STDC_IEC_559_ недостаточно для проверки соответствия IEEE-754 в экосистеме Apple.
Да и нет.Во-первых, отчасти это зависит от вашего компилятора, а не только от ОС.Во-вторых, вам нужно быть осторожным в том, как вы интерпретируете использование этого макроса компилятором.
В предварительном порядке макрос __STDC_IEC_559__
(примечание: два конечные подчеркивания) был введен вC99.Есть еще компиляторы, которые не соответствуют C99, по крайней мере по умолчанию.Чтобы вообще иметь смысл тестировать __STD_IEC_559__
, сначала необходимо проверить, заявляет ли компилятор о соответствии C99 или более поздней версии:
#if __STDC__ && __STDC_VERSION__ >= 19901L
// __STDC_IEC_559__ may tell us something ...
#endif
Предположим, что вы работаете с соответствующей реализациейЗатем вам нужно понять, что если реализация определяет __STDC_IEC_559__
в 1, она утверждает, что она соответствует всем спецификациям в Приложении F (C11) или Приложении G (C99) стандарта, которыйохватывает не только форматы данных с плавающей точкой, но и довольно широкий спектр спецификаций для операторов и функций, включая границы ошибок.Определение __STDC_IEC_559__
not ничего не говорит о том, какие части не поддерживаются.На практике почти все используют форматы данных ISO 60559 в наши дни, но полное соответствие ISO 60559. относительно редко.
Какой MacOS поддерживает полный IEEE-754 или, по крайней мере, часть с форматом binary32 и binary64и как проверить это с помощью одного или нескольких макросов препроцессора C?
Насколько мне известно, все версии MacOS / OS X, работающие на микросхемах Intel, поддерживают двоичные 32 и двоичные 64 как родные с плавающей точкойформаты.Все распространенные компиляторы для этих платформ отображают эти собственные типы в C float
и double
.Не существует надежного стандартного способа получить тест препроцессора C, который, однако, потому что никакие стандартные макросы не предоставляют эту информацию, а для реального тестирования потребуется математика с плавающей запятой, которую препроцессор не выполняет.
БлижайшийВы можете приступить к тестированию форматов данных через препроцессор, чтобы включить float.h
и изучить макросы, определяющие характеристики типов float
и double
.Но даже если эти характеристики в точности соответствуют характеристикам binary32 / binary64, это не доказывает, что фактические представления в памяти принимают эти формы.Если вы особенно заботитесь о представлении, вам понадобится внешняя тестовая программа.