[英]Is it possible to have an unlimited precision floating point data type, in either visual basic, java, or 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分別設置精度為double
和single
。 您可能希望使用_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.