數字要求

我們所稱作的"數字"是interval類的基類型. 為了確保包含性質,區間庫期望基類型滿足一些性質. 所有的這些性質在這份文檔的其它部分已經有詳細的描述,但我們將會在這裡對它們進行總結:

順序

應當以一種順序來提供這些數字應. 通過運算符< <= => > == !=來表達這種順序. 它需要是全序的(自反性, 反對稱性, 傳遞性, 以及每一對數字應當是有序的). 所以complex<T> 不是一個好的基類型的候選,如果你需要區間保持包含性質, 你應當使用complex< interval<T> >來取代interval< complex<T> > (但不幸的是,complex僅提供特化).

請注意:非法的數字不被順序所考慮,如果與非法數字的比較返回 false在概念上要更好一些(除了!=). 如果你的檢查策略使用interval_lib::checking_base並且你的基類型包含非法數字,那麼這個性質就是必須的: nan!=nan (這裡nan 是一個非法數字). 如果沒滿足這種性質,那麼你不應當直接使用checking_base.

區間算術涉及到許多與0的比較. 默認情況下, 它們通過與static_cast<T>(0)比較來完成. 然而,如果這個數字的形式允許一些更快的與0的比較方法,那麼名字空間interval_lib::user中的模板函數應當被特化。

namespace user {
template<class T> inline bool is_zero(T const &v) { return v == static_cast<T>(0); }
template<class T> inline bool is_neg (T const &v) { return v <  static_cast<T>(0); }
template<class T> inline bool is_pos (T const &v) { return v >  static_cast<T>(0); }
}

數值限制

檢查策略的另一個要點. 通常它足夠有效來處理基類型產生的異常情況,特別是無限和非法數字(歸功於:pos_inf, neg_inf, nanis_nan四個函數).然而,如果你使用interval_lib::checking_base (默認的比較策略使用它),你的基類型應當有一個正確的std::numeric_limits<T>特化. 特別是,has_infinityhas_quiet_NaN的值, 以及定義相應的函數 infinityquiet_NaN

因此,概括一下, 如果你沒有依賴於默認的策略並且沒有使用interval_lib::checking_base, 那麼就沒有必要提供一個針對於你的基類型的數值限制的特化.

數字性質

確保數字正確的排序並不夠,依賴於順序,基本的運算符應當滿足一些性質,如下::

上面的性質也用於(並且足夠了)函數abs, squarepow. 對於所有的超越函數(包括函數sqrt), 需要滿足其它的性質。 與對應的真正的函數相比,這些函數應當具有相同的性質,例如:對於cos期望的性質為:

捨入

如果你所操作的基類型不會產生不精確的計算結果,你可以跳過餘下的段落,如果你對包含性質不感興趣(如果近似值已經足夠的話),你同樣可以跳過這些段落. 如果你還在閱讀,可能是你想知道捨入策略應當滿足的基本性質。

無論你考慮哪一個運算或函數, 應當滿足下面的性質: f_down(x,y) <= f(x,y) <= f_up(x,y). 這裡f為無限精度的計算函數而函數f_down和函數f_up 是返回值不精確但類型正確(基類型)的函數. 如果可能的話,它們應當返回最鄰近的可表達的值,但並不是永遠都那麼簡單。

常量

為確保三角函數可以正常工作,庫需要知道常量π的值,因為在基類型中這些常量可能無法描述,所以interval庫不需要知道精確的值,一個下界和一個上界就足夠了,如果用戶沒有提供這些值,將會使用默認值,它們是整數值(π被定界為34).

運算符和轉換

就像開始解釋的那樣,應當針對基類型定義比較運算符. 捨入策略定義了許多區間庫使用的函數,因此,不需要為基類型定義算術運算符(除非被一個預定義的類所要求). 然而,有一個例外 :需要定義一元取負運算符. 更重要的是,這個運算符應當返回精確的值; 這就是為什麼捨入策略沒有提供一些 否定函數(negation functions)。

需要定義從int到基類型的轉化(僅需要一些值是可用的: -1, 0, 1, 2). 這種轉換的另一種繞道方式是使用捨入策略來提供 (成員函數int_downint_up); 再沒有其它轉化要求,然而,為了從區間轉換中獲益,在捨入策略中提供盡可能多的轉化是很有價值的(成員函數conv_downconv_up)


Valid HTML 4.01 Transitional

Revised 2006-12-24

Copyright © 2002 Guillaume Melquiond, Sylvain Pion, Hervé Brönnimann, Polytechnic University
Copyright © 2004 Guillaume Melquiond

Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)