Привет,
Я пытаюсь использовать устойчивые предикаты для вычислительной геометрии от 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 Ваша справка
Параметр компилятора, который вам нужен для Visual Studio, - / fp: strict
, который отображается в среде IDE как Project-> Свойства-> C / C ++ -> Генерация кода-> Модель с плавающей запятой
Если вы используете GCC, здесь может помочь ответ SO:
Если вы используете другой компилятор, вы можете найти некоторые подсказки в этом примере ( или, может быть, опубликуйте комментарий к этому ответу, чтобы узнать, может ли Майк Динсдейл знать.
_control87 (_PC_53, _MCW_PC)
или _control87 (_PC_24, _MCW_PC)
помогут. Они устанавливают точность double
и single
соответственно с MSVC. Возможно, вы захотите использовать _controlfp_s (...)
, поскольку это позволяет вам явно получить текущее управляющее слово после его установки.
Как отмечали другие, вы можете справиться с этим, установив управляющее слово x87 для ограничения точности с плавающей запятой. Однако лучшим способом было бы заставить MSVC генерировать код SSE / SSE2 для операций с плавающей запятой; Я удивлен, что он не делает этого по умолчанию в наши дни, учитывая преимущества в производительности (и тот факт, что он предотвращает появление раздражающих ошибок, подобных тем, что вы видите), но нет никакого учета MSVC. идиосинкразии.
Не говоря уже о MSVC, я считаю, что флаг / arch: SSE2
заставит MSVC использовать инструкции SSE и SSE2 для арифметических операций с одинарной и двойной точностью, что должно решить проблему.
Да, вам придется изменить управляющее слово FPU, чтобы избежать этого. Это хорошо объяснено для большинства популярных компиляторов на этой веб-странице. Имейте в виду, что это кардинально несовместимо с тем, что большинство библиотек ожидают от FPU, не смешивайте и не подбирайте. Всегда восстанавливайте управляющее слово FPU после завершения работы.