Подтвердить что ты не робот

Почему Microsoft отказалась от длинного двойного типа данных?

Некоторое время назад я написал программу, в которой использовались некоторые факториальные функции. Я использовал длинный двойной тип данных для поддержки "относительных" больших чисел.

Теперь я изменился с кодовых блоков на VisualStudio 2010, мне было интересно, почему моя программа больше не работает, пока я не понял после некоторых исследований, что MS отказалась от длинного двойного типа данных. Есть ли для этого какая-то особая причина? Для меня это очень похоже на шаг назад с точки зрения технологии.

Есть ли альтернатива для использования? (Я также был бы доволен альтернативой из библиотеки ускорения).

4b9b3361

Ответ 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.