Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

對實數類型的概念性要求(Conceptual Requirements for Real Number Types)

這個庫中的所有的函數和分佈類型可以與滿足下面給出的要求的任何的RealType 一起使用。所有的內建的(built-in)浮點類型都滿足這些要求。用戶定義的數據類型如果滿足這些要求也可以與這個庫一起使用。例如,一個對NTL (RR) 進行一個 廋包裝類(thin wrapper class) 也可以使用。提交與其它的擴展精度類型進行綁定的代碼也是非常受歡迎的!

在這些指導原則背後的要求是RealType 的行為與一個內建的(built in)的浮點類型的行為一樣。

基本算術要求(Basic Arithmetic Requirements)

對於這個庫中的所有函數,這些要求是通用的。

在下面的表中,r 是一個 RealType類型的對象,crcr2 const RealType類型的對象,且ca是一個 const arithmetic-type 類型的對象(算術類型包含所有內建的(built in)整型和浮點類型)。

表達式

結果類型

說明

RealType(cr)

RealType

RealType可拷貝構造.

RealType(ca)

RealType

RealType 可以從算術類型對像進行拷貝構造。

r = cr

RealType&

賦值運算符。

r = ca

RealType&

可以從算術類型進行賦值的賦值運算符。

r += cr

RealType&

將 cr 加到 r。

r += ca

RealType&

將 ar 加到 r。

r -= cr

RealType&

從 r 中減去cr 。

r -= ca

RealType&

從 r 中減去ca 。

r *= cr

RealType&

用 r 乘以 cr

r *= ca

RealType&

用 r 乘以 ca。

r /= cr

RealType&

用 cr 除以 r 。

r /= ca

RealType&

用 ca 除以 r。

-r

RealType

一元取負。

+r

RealType&

相等運算符。

cr + cr2

RealType

二元加法。

cr + ca

RealType

二元加法。

ca + cr

RealType

二元加法。

cr - cr2

RealType

二元減法。

cr - ca

RealType

二元減法。

ca - cr

RealType

二元減法。

cr * cr2

RealType

二元乘法。

cr * ca

RealType

二元乘法。

ca * cr

RealType

二元乘法。

cr / cr2

RealType

二元除法。

cr / ca

RealType

二元除法。

ca / cr

RealType

二元除法。

cr == cr2

bool

相等比較。

cr == ca

bool

相等比較。

ca == cr

bool

相等比較。

cr != cr2

bool

不相等比較。

cr != ca

bool

不相等比較。

ca != cr

bool

不相等比較。

cr <= cr2

bool

小於等於。

cr <= ca

bool

小於等於。

ca <= cr

bool

小於等於。

cr >= cr2

bool

大於等於。

cr >= ca

bool

大於等於。

ca >= cr

bool

大於等於。

cr < cr2

bool

小於比較。

cr < ca

bool

小於比較。

ca < cr

bool

小於比較。

cr > cr2

bool

大於比較。

cr > ca

bool

大於比較。

ca > cr

bool

大於比較。

boost::math::tools::digits<RealType>()

int

RealType中的有效數字的個數。

boost::math::tools::max_value<RealType>()

RealType

RealType類型可以表示的最大的數。

boost::math::tools::min_value<RealType>()

RealType

RealType類型可以表示的最小的數。

boost::math::tools::log_max_value<RealType>()

RealType

RealType類型可以表示的最大的數的自然對數。

boost::math::tools::log_min_value<RealType>()

RealType

RealType類型可以表示的最小的數的自然對數。

boost::math::tools::epsilon<RealType>()

RealType

RealType類型的機器精度(machine epsilon)

注意:

  1. 函數log_max_value 和函數 log_min_value 可以由其它函數合成,因此沒有要求明確的特化(explicit specialisation)。
  2. 函數epsilon 可以由其它的函數合成,所以,如果RealType的精度在運行時不會發生改變,那麼沒有要求明確的特化(explicit specialisation)(參考boost/math/bindings/rr.hpp 頭文件瞭解精度在運行時發生變化)。
  3. 函數digits, max_valuemin_value,可以從std::numeric_limits自動合成。然而如果對類型RealType沒有特化函數numeric_limits ,那麼當代碼試圖使用這些函數的時候,你會得到一個編譯錯誤,除非你明確地特化化這個函數。例如,如果 RealType的精度在運行時發生變化,那麼對函數numeric_limits 的支持可能是不合適的。參考boost/math/bindings/rr.hpp 來查看一些例子。
[Warning] 提示

如果std::numeric_limits<> 沒有針對RealType 類型進行特化,那麼缺省的浮點精度為6個有效數字將會被其它包含的Boost程序所使用:

Boost.Test: 給出的迷惑性報錯消息(misleading error messages)類似於

"difference between {9.79796} and {9.79796} exceeds 5.42101e-19%".

Boost.LexicalCast 和 Boost.Serialization 在將數值轉換成字符串的時候會產生嚴重的精度損失。

雖然看起來應當要求 RealType 提供對std::numeric_limits 的特化,但是對於數字個數是一個運行時變量的 NTL::RR 和其它類似的類是不合理的(因為numeric_limits 是一個在編譯時必須固定的值)。

標準庫支持要求(Standard Library Support Requirements)

這個庫中的許多函數(雖然不是所有的)都調用了標準庫中的函數,下面的表總結了這些要求。注意,這個庫中的大多數函數只會調用這裡列舉的函數中的很少一部分,因此,如果對一個用戶定義的類型是否對標準庫有足夠的支持而可以使用存在疑慮,那麼最好的建議是進行嘗試並查看結果!

在下面的表中r 是一個 RealType類型的對象,cr1cr2const RealType類型的對象,而iint型對象。

表達式

結果類型

fabs(cr1)

RealType

abs(cr1)

RealType

ceil(cr1)

RealType

floor(cr1)

RealType

exp(cr1)

RealType

pow(cr1, cr2)

RealType

sqrt(cr1)

RealType

log(cr1)

RealType

frexp(cr1, &i)

RealType

ldexp(cr1, i)

RealType

cos(cr1)

RealType

sin(cr1)

RealType

asin(cr1)

RealType

tan(cr1)

RealType

atan(cr1)

RealType

fmod(cr1)

RealType

round(cr1)

RealType

iround(cr1)

int

trunc(cr1)

RealType

itrunc(cr1)

int

注意,上面的表中只列舉了那些已知會被這個庫用到的標準庫函數(或者有可能在將來的庫的實現中用到)。下面的函數:acos, atan2, fmod, cosh, sinh, tanh, log10, lround, llround, ltrunc, lltrunc 以及modf` 當前並沒有用到,但是如果將來增加新的特殊函數就可能用到。

注意,函數round, truncmodf 並不是當前的C++標準的一部分:它們是C99標準的增加部分,並可能成為下一個C++標準的一部分。Boost庫實現的這些函數作為一個備份(backup),這些函數總是稱作未修飾的(unqualified),以便可以進行參數依賴性查找( argument-dependent-lookup) 。

除此之外,對於高效和高精度的結果,非常期望有一個蘭克澤斯逼近(Lanczos approximation) 。 你或許可以從 boost/math/special_functions/lanczos.hpplibs/math/tools/ntl_rr_lanczos.hpp中修改一個已存在的逼近方法:你將需要修改 static_cast 為 lexical_cast ,並將常量改為字符串(為了確保係數不會被截斷為 long double) 並且對於T類型特化lanczos_traits 。否則你需要研究libs/math/tools/lanczos_generator.cpp 來為你的RealType查找一個合適的逼近方法。如果你沒有這樣做,代碼也可以編譯,但是對於任何的調用 gamma/beta/erf 系列函數的函數,精度和效率都會大打折扣。


PrevUpHomeNext