Означают ли типы, начинающиеся с двойного подчеркивания, эмулируемый тип? - PullRequest
2 голосов
/ 19 сентября 2019

Существует тип long double для 80-битного числа с плавающей запятой, в x87 extantion есть инструкции для работы с этим типом данных.

Я знаю, что есть __float128, и базовые операции с этим типом эмулируются компилятором.Но нет необходимости эмулировать 80-битные операции с плавающей точкой.Какова цель __float80 тогда?

Я предполагаю, что в некоторых архитектурах нет 80-битного типа данных с плавающей запятой, поэтому __float80 подобен кроссплатформенному типу.Если процессор способен работать с 80-битным fp, то long double означает то же, что и __float80.Если нет, то long double не существует или ссылается на что-то еще, и компилятор эмулирует 80-битные операции fp, поэтому для представления 80-битной точки floatg можно использовать только __float80.

Я прав?Можете ли вы показать мне несколько примеров?

Ответы [ 2 ]

5 голосов
/ 19 сентября 2019

Двойное подчеркивание указывает, что идентификатор зарезервирован для использования реализацией C.

C11 стандарт 7.1.3: зарезервированные идентификаторы

  • Все идентификаторы, которые начинаются со знака подчеркивания, а также заглавной буквы или другого подчеркивания, всегда зарезервированы для любого использования.
  • Все идентификаторы, начинающиеся со знака подчеркивания, всегда зарезервированы для использования в качестве идентификаторов.с областью видимости файла как в обычном пространстве, так и в пространстве имен тегов.

По сути, это пространство имен зарезервировано, чтобы избежать конфликтов с идентификаторами, созданными для общего использования.Реализация может быть уверена, что она не закроет свои собственные идентификаторы, и до тех пор, пока ваша программа не использует зарезервированное пространство идентификаторов, начинающееся с двойного подчеркивания (или подчеркивания, за которым следует заглавная буква), конфликтов не будет.

2 голосов
/ 19 сентября 2019

Нет, __ не означает эмуляцию, это не означает один из типов из стандарта ISO C.Реализации не хотят загрязнять глобальное пространство имен именами, такими как float80, поэтому они используют имена, такие как __float80 и __int128, потому что ISO C резервирует имена с двойным подчеркиванием для использования реализацией.

Iможно было бы предположить, что __float80 дает вам доступ к 80-битной функции с плавающей запятой даже при компиляции для MS Windows ABI, где long double имеет тот же формат, что и double.(IEEE binary64).

Вы можете думать о __float80 и __float128 как о специфических для реализации эквивалентах int64_t вместо long или long long. на платформахкоторые имеют собственную 80-битную FP, __float80 не нуждается в эмуляции.

Для других целей __float80 может вообще не поддерживаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...