По результатам продолжающегося портирования приложения с CodeGear (Borland) C++ на VC++/Qt/MinGW выяснилась пикантная деталь: компилятор Visual Studio считает тип long double синонимом типа double (), и вместо привычных и полюбившихся 80 бит мы получаем куцые 64 и робко надеемся, что гамма-функции в функциях распределения, например, Накагами и двустороннем экспоненциальном не превысят DBL_MAX (~1.8E+308). Для кого это число кажется заведомо большим, а ситуация надуманной, могут с чистой совестью порадоваться своему счастью и переключиться на кофе, игру с любимым котом или просмотр свежего кино на плазменном экране, а я продолжу.
Чтобы представить себе скорость роста гамма-функции, напомню, что для натурального n Г(n+1) = n!. Поэтому, Г(172) = ~1.24E+309 и вылезает за пределы точности 64-битного формата. Словом, когда точность вычислений играет роль, хочется использовать числа подлиннее, благо архитектура x87 оперирует именно 80-битными числами в формате extended. И именно эти числа не поддерживаются компилятором MSVC.
По традиции, хотелось бы ругнуть микрософт за выбор своего, особого пути, но лучше вчитаемся в стандарт C++ (3.9.1/8):
There are three floating point types: float, double, and long double. The type double provides at least as much precision as float, and the type long double provides at least as much precision as double. The set of values of the type float is a subset of the set of values of the type double; the set of values of the type double is a subset of the set of values of the type long double. The value representation of floating-point types is implementation-defined. Integral and floating types are collectively called arithmetic types. Specializations of the standard template std::numeric_limits (18.2) shall specify the maximum and minimum values of each arithmetic type for an implementation.
Вкратце: double имеет точность не меньше float, а long double - не меньше double. Значения float являются подмножеством значений double, а значения double - подмножеством long double.
Бьярн Страуструп подливает масла в огонь:
"Типы с плавающей запятой соответствуют числам с плавающей запятой. Как и целые типы, они могут быть трех размеров: float (одинарная точность), double (двойная точность) и long double (расширенная точность).
Точный смысл каждого типа зависит от реализации. Выбор оптимальной точности в конкретных задачах требует изрядных знаний в области вычислений с плавающей запятой. Если у вас их нет, то проконсультируйтесь со специалистом, или основательно изучите предмет, или используйте тип double наудачу."
То есть, стандарт не только не описывает количество бит под мантиссу и экспоненту для каждого типа, но и позволяет этим типам совпадать! Чего я лично не встречал, но не вижу ничего нереального для процессора на каком-нибудь ма-а-а-аленьком микроконтроллере. В таких условиях нечего и говорить о написании переносимого вычислительного кода, потому что даже в рамках виндовых компиляторов это можно сделать не в полной мере. Borland вгоняет в тоску, MSVC объединяет double и long double в единое целое, Intel красавчик и стоит денег, MinGW может что надо, но не хватает звезд с неба. Лично у меня велико желание не переписывать готовый код (это ещё сильно надо подумать, как обойтись без расширенной точности) и одновременно использовать доступный мне лицензионный MSVC, и поэтому ситуация не выглядит радужной. Одна из мыслей на тему: уж не стабильность ли поведения заставляет людей писать на фортране, кроме гигантского объема унаследованного кода.
Читайте также
Последние новости
План занятий
Обучение детей от года до 3 лет плаванию, как правило, проходит в три этапа. На первом этапе ребенок должен адаптироваться к воде, избавиться от страха перед глубиной, неизвестной средой. Намного проще дети привыкают к бассейну, где есть бортики, вода теплая и прозрачная. Чуть сложнее дети адаптируются к открытым водоемам с темной и прохладной ...Читать далее »
Гимнастика от 2 лет до 2 лет 6 месяцев
1. Самостоятельная ходьба. 2. Бег вдогонку за взрослым или к взрослому в разном темпе. 3. Руки вверх, потянуться – «деревья большие большие», развести руки в стороны. 4. Ходьба по доске, приподнятой над полом на 15–20 см. 5. Приседания. 6. Подъем туловища с опорой на ладони в положении лежа на животе. 7. Хлопк...Читать далее »
Проблема: ожоги, ушибы, травмы
Немного повзрослев, ребенок начинает интересоваться источниками огня, что чревато ожогом. При незначительном ожоге необходимо поврежденный участок тела поместить под холодную проточную воду, а затем обработать антиожоговым аэрозолем. В период выздоровления применяют массаж, который способствует улучшению лимфо– и кровотока. В резуль...Читать далее »
Проблема: плоскостопие
Когда ребенок начинает ходить, его первые шаги могут быть омрачены плоскостопием. К сожалению, если эта болезнь наследственная, то волнения вполне обоснованны. И здесь без посещения детского врача ортопеда не обойтись. Его рекомендации относятся к укреплению подошвенного свода стопы вашего ребенка. Костная структура стопы ребенка ...Читать далее »
Рефлекторные движения
Рефлекторные гимнастические упражнения, В основе которых лежат врожденные двигательные рефлекторные реакции, проводятся первые три пять месяцев жизни ребенка, когда еще не утрачены безусловные двигательные рефлексы – «автоматическая походка», ладонно ротовой рефлекс, хоботковый рефлекс, сохранение равновесия, защитно оборонительные рефлексы. Рефлекторные гимнасти...Читать далее »
Техника выполнения: растирание
Прямолинейное растирание Выполняется концевыми фалангами одного или нескольких пальцев. Движение проводится прямолинейно одной рукой или обеими, иногда с отягощением. Круговое растирание Проводится с помощью круговых движений концевыми фалангами одного или нескольких пальцев. Кисть располагается с опорой на основании ладони, а манипуляции выполняют в сторону мизинца одной рук...Читать далее »
Проблема: пупочная грыжа
Пупочная грыжа – это патологическое состояние, в котором через несколько расширенное пупочное кольцо происходит выпячивание брюшины, сальника и даже кишечника. Причина заболевания следующая: вследствие дефекта передней брюшной стенки и пупочного кольца проявляется округлое или овальное выпячивание. Чаще факторами, провоцирующими повышение внутрибрюшного давления, являются кашель, запоры ...Читать далее »
