Необходимые флаги компилятора C, чтобы проверить MacOS (старый и новый) на соответствие IEEE-754 - PullRequest
0 голосов
/ 13 февраля 2019

Кажется, что __STDC_IEC_559__ недостаточно для проверки соответствия IEEE-754 в экосистеме Apple, что приводит к моему вопросу:

Какой MacOS поддерживает полный IEEE-754 или, по крайней мере, часть сФормат binary32 и binary64 и как его проверить с помощью одного или нескольких макросов препроцессора C?

1 Ответ

0 голосов
/ 13 февраля 2019

Похоже, что __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, это не доказывает, что фактические представления в памяти принимают эти формы.Если вы особенно заботитесь о представлении, вам понадобится внешняя тестовая программа.

...