2014-02-04 2 views
1

Я портировал код с C++ на Visual C++ (это первый раз, когда я закодирован в среде Visual C++). В коде много математики, и я вижу, что исходный код и портированный код имеют разные результаты.Visual C++ double vs C++ double

Почти все мои переменные имеют двойной тип данных.

Возможно, это глупый вопрос, но есть ли разница между Visual C++ double и C++ double? Любые различия в диапазоне? Я не могу найти какую-либо документацию на Visual C++, объясняющую ее типы данных.

+0

Какую версию Visual Studio вы используете? А для какого компилятора был написан оригинальный код? – RedX

+0

Что такое двойной C++? – Samuel

+0

Также вы видите различия в * оптимизированных * построениях? Параметры компилятора могут влиять на математику с плавающей запятой. – crashmstr

ответ

1

На первый взгляд нет разницы, но разные компиляторы могут оптимизировать выражения по-разному.

Параметры генерации кода в свойствах проекта имеют параметр модели с плавающей запятой. Это может быть точным, строгим или быстрым.

+0

Спасибо за ответ! Он установлен в Точный. Когда я изменяю его на Strict, я получаю следующую ошибку: D8016: параметры командной строки '/ clr' и '/ fp: strict' несовместимы. – Diemauerdk

3

Взгляните на это: http://www.altdevblogaday.com/2012/03/22/intermediate-floating-point-precision/

VS имеет опцию /Ф.П. (http://msdn.microsoft.com/en-us/library/e7s85ffb.aspx) для указания точки точности с плавающей (по аналогии с fastmath для CUDA). Некоторые из них также могут препятствовать внутренним условиям; если у вас есть преобразование может быть большая разница ..

Наконец, поведение и значения по умолчанию для этих настроек зависит от компилятора (http://social.msdn.microsoft.com/Forums/vstudio/en-US/ebab293c-0c85-462e-a352-22ff8ee55c36/sqrt-code-optimization-is-twice-faster-on-vs20082010-than-vs2012-sse?forum=vcgeneral)

+0

Thx для ссылок, это объясняет несколько вещей. Я воспользуюсь некоторыми предложениями и посмотрю, поможет ли это. – Diemauerdk

3

магазины Visual C++ удваивается, используя формат IEEE 754. Не существует специального определения для «C++ double», но я был бы поражен, если бы вы узнали, что не использует IEEE 754, поскольку это родная кодировка для большинства процессоров.

Так что нет, нет никакой разницы!

+0

Не должно быть разницы :) – user1095108

1

Насколько я понимаю, в 32-битном режиме Visual Studio использует x87, а в 64-разрядном режиме использует как минимум SSE2. Значение по умолчанию для Visual Studio заключается в компиляции в 32-разрядном режиме даже в 64-разрядной ОС, тогда как по умолчанию для компиляции на GCC используется 64-разрядный режим в 64-разрядной ОС. Поэтому, возможно, речь идет только о 32-битном или 64-битном режиме. Попробуйте выполнить компиляцию кода в 64-битном режиме в Visual Studio. Вы можете это сделать даже в версии Express с MSVC 2010.

x87 и SSE - это разные аппаратные средства. x87 использует 80 бит для внутренних вычислений (но хранит только 64-разрядные), а SSE имеет только 64-битные. В Википедии есть хорошее объяснение, почему 80 бит были выбраны для x87 http://en.wikipedia.org/wiki/Extended_precision#Need_for_the_80-bit_format

+0

thx Я попробую! – Diemauerdk