Ответ 1
Я не уверен, почему вы думаете, что long double
был "оставлен", так как он является частью стандарта С++, и поэтому совместимая реализация должна его реализовать.
То, что они сделали "отказаться" , это long double
перегрузки математических функций, и они сделали это, потому что:
Однако при программировании Win32 тип данных
long double
сопоставляется с типом данныхdouble
, 64-разрядной точности.
который, в свою очередь, вместе с long double
в более старых версиях VS составляет 80 бит, заключается в том, что:
Генерация кода FP переключилась на использование наборов инструкций SSE/SSE2/SSE3 вместо стека x87 FP, так как это то, на что сосредоточены усилия разработчиков и последних поколений чипов AMD и Intel. Эти наборы инструкций поддерживают только форматы форматов 32 и 64 бит.
Тем не менее, они решили не поддерживать эти перегрузки, даже с такими же размерами double
и long double
(оба могут быть сделаны 64-битными), это позор, потому что они также являются частью стандарта С++, Но, ну, это Microsoft для вас. Настойчиво упрямый.
[n3290: 26.8]:
В дополнение к версиямdouble
математики функции в<cmath>
, С++ добавляетfloat
иlong double
перегруженные версии этих функций с той же семантикой.
Однако, хотя эти перегрузки по существу устарели в Visual Studio, они все еще доступны, поэтому вы все равно сможете их использовать:
Библиотека времени выполнения Microsoft предоставляет версии
long double
математические функции только для обратной совместимости.
Есть ли альтернатива для использования? (Я также был бы доволен альтернативой из библиотеки ускорения).
Мне кажется, что вы полагаетесь на long double
для поддержки определенного диапазона числовых значений и, следовательно, сталкиваетесь с проблемами регрессии, когда это изменилось в другой инструментальной цепочке.
Если у вас есть определенное числовое требование диапазона, используйте интегральные типы фиксированного диапазона. Здесь у вас есть несколько вариантов:
-
stdint.h
- функция C99, которая поддерживает С++ toolchains как расширение; -
stdint.h
- функция C99, которая Boost повторно реализует как библиотеку; -
cstdint
- функция С++ 0x, которая может быть полезной, если вы пишете код С++ 0x.