簡體   English   中英

編譯時與運行時常量

[英]Compile-time vs runtime constants

我正在開發自己的數學庫來提高我的c ++技能。 我偶然發現了boost的常量頭文件 ,我問自己在運行時聲明的常量上使用編譯時常量有什么意義?

const float root_two = 1.414213562373095048801688724209698078e+00;
const float root_two = std::sqrt( 2.0f );

使用固定的編譯時常量但是在運行帶有函數的應用程序時進行計算時是不是會引入錯誤? 如果使用運行時常量,那么錯誤是否會被忽略?

  1. 正如HansPassant所說,它可能會為你節省微瓦。 但是,請注意,編譯器有時會通過在編譯期間評估表達式並在文字值中替換來優化它。 請參閱我之前關於此問題的答案

  2. 使用固定的編譯時常量時是否存在錯誤? 如果您正在使用任意精度數據類型。 但是使用像double這樣的普通數據類型更有效,並且這些數據僅限於大約16個十進制數字的精度。

  3. 基於(2),您的第二次初始化將不會比您的第一次初始化更精確。 實際上,如果使用任意精度計算器預先計算平方根的值,則文字甚至可能精確。

像Boost這樣的庫必須在大量的環境中工作。 使用該庫的應用程序可以設置FPU可以處於從零到零模式,為非正規化(微小)結果提供0.0。

或者應用程序可能已使用-fast-math標志進行編譯,從而產生不准確的結果。

此外,(a + b + c)的運行時計算取決於編譯器生成的代碼將如何存儲中間結果。 它可能選擇從FPU彈出(a + b)為64位雙精度,或者它可以將它作為80位留在FPU堆棧上。 它取決於大量的東西,也取決於相關性的代數重寫。

總而言之,如果您混合使用不同的處理器,操作系統,編譯器以及庫內部使用的不同應用程序,您將獲得上述每種排列的不同結果。

在一些(罕見的)情境中,這不是必需的; 你可能需要一個確切的恆定值。

暫無
暫無

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

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