Точность с плавающей точкой в Visual C++

Привет,

Я пытаюсь использовать устойчивые предикаты для вычислительной геометрии от Jonathan Richard Shewchuk.

Я не программист, таким образом, я даже не уверен в том, что я говорю, я могу делать некоторую основную ошибку.

Точка является предикатами, должен допускать точный aritmthetic с адаптивной точностью с плавающей точкой. На моем компьютере: Asus pro31/S (Базовый Должный Процессор Центрино) они не работают. Проблема может остаться в факте, мой компьютер может использовать некоторые улучшения точности с плавающей точкой конфликты TAHT с тем, используемым Shewchuk. Автор говорит:

/* On some machines, the exact arithmetic routines might be defeated by the  */
/*   use of internal extended precision floating-point registers.  Sometimes */
/*   this problem can be fixed by defining certain values to be volatile,    */
/*   thus forcing them to be stored to memory and rounded off.  This isn't   */
/*   a great solution, though, as it slows the arithmetic down.              */

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

Я действительно appriaciate Ваша справка

8
задан JoeG 2 April 2010 в 09:14
поделиться

5 ответов

Параметр компилятора, который вам нужен для Visual Studio, - / fp: strict , который отображается в среде IDE как Project-> Свойства-> C / C ++ -> Генерация кода-> Модель с плавающей запятой

3
ответ дан 5 December 2019 в 18:58
поделиться

Если вы используете GCC, здесь может помочь ответ SO:

Если вы используете другой компилятор, вы можете найти некоторые подсказки в этом примере ( или, может быть, опубликуйте комментарий к этому ответу, чтобы узнать, может ли Майк Динсдейл знать.

0
ответ дан 5 December 2019 в 18:58
поделиться

_control87 (_PC_53, _MCW_PC) или _control87 (_PC_24, _MCW_PC) помогут. Они устанавливают точность double и single соответственно с MSVC. Возможно, вы захотите использовать _controlfp_s (...) , поскольку это позволяет вам явно получить текущее управляющее слово после его установки.

2
ответ дан 5 December 2019 в 18:58
поделиться

Как отмечали другие, вы можете справиться с этим, установив управляющее слово x87 для ограничения точности с плавающей запятой. Однако лучшим способом было бы заставить MSVC генерировать код SSE / SSE2 для операций с плавающей запятой; Я удивлен, что он не делает этого по умолчанию в наши дни, учитывая преимущества в производительности (и тот факт, что он предотвращает появление раздражающих ошибок, подобных тем, что вы видите), но нет никакого учета MSVC. идиосинкразии.

Не говоря уже о MSVC, я считаю, что флаг / arch: SSE2 заставит MSVC использовать инструкции SSE и SSE2 для арифметических операций с одинарной и двойной точностью, что должно решить проблему.

1
ответ дан 5 December 2019 в 18:58
поделиться

Да, вам придется изменить управляющее слово FPU, чтобы избежать этого. Это хорошо объяснено для большинства популярных компиляторов на этой веб-странице. Имейте в виду, что это кардинально несовместимо с тем, что большинство библиотек ожидают от FPU, не смешивайте и не подбирайте. Всегда восстанавливайте управляющее слово FPU после завершения работы.

3
ответ дан 5 December 2019 в 18:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: