簡體   English   中英

Visual C ++中的浮點精度

[英]Floating point precision in Visual C++

HI,

我試圖使用Jonathan Richard Shewchuk的計算幾何的強大謂詞

我不是程序員,所以我甚至不確定我在說什么,我可能會做一些基本的錯誤。

關鍵是謂詞應該允許具有自適應浮點精度的精確算法。 在我的電腦上:華碩pro31 / S(Core Due Centrino處理器)它們無法正常工作。 問題可能在於我的計算機可能會使用與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.              */

現在我想知道的是,有一種方法,可能是一些編譯器選項,來關閉內部擴展精度浮點寄存器。

我非常感謝你的幫助

Visual Studio所需的編譯器選項是/fp:strict ,它在IDE中公開為Project->Properties->C/C++->Code Generation->Floating Point Model

是的,您必須更改FPU控制字以避免這種情況。 對於此網頁中大多數流行的編譯器,它都有很好的解釋。 請注意,這與大多數庫希望FPU執行的操作非常不兼容,請不要混用和匹配。 完成后,務必恢復FPU控制字。

_control87(_PC_53, _MCW_PC)_control87(_PC_24, _MCW_PC)_control87(_PC_24, _MCW_PC) 那些使用MSVC分別設置精度為doublesingle 您可能希望使用_controlfp_s(...) ,因為它允許您在設置后顯式檢索當前控制字。

正如其他人所說,你可以通過設置x87控制字來限制浮點精度來解決這個問題。 但是,更好的方法是讓MSVC為浮點運算生成SSE / SSE2代碼; 我很驚訝它在這個時代默認不會這樣做,因為它具有性能優勢(以及它可以防止你遇到像你所看到的那樣煩人的bug),但是沒有考慮MSVC的特質。

除了關於MSVC之外,我認為/arch:SSE2標志將導致MSVC使用SSE和SSE2指令進行單精度和雙精度算術,這應該可以解決這個問題。

如果您正在使用GCC,那么這里的SO答案可能有所幫助:

如果您正在使用其他編譯器,那么您可以在該示例中找到一些線索(或者可以發布對該答案的評論以查看Mike Dinsdale是否可能知道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM