AFFINE_SIMPLEを定義することによってダミー変数追加のポリシーを変えることが出来る。 上の Affine Arithmeticについて の資料の方法1,2,3にそれぞれ 対応している。
/* * define simplicity of affine arithmetic * * value of AFFINE_SIMPLE | 0 | 1 | 2 * ------------------------------------------+---+---+--- * add dummy epsilon on linear operation | o | x | x * add dummy epsilon on nonlinear operation | o | o | x */の通り。defaultは1。コンパイル時に-DAFFINE_SIMPLE=0とかすると、線形計算でも ダミー変数を追加するようになり高性能だが遅くなる。-DAFFINE_SIMPLE=2なら逆。
pow, sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh も持っているが、これらは簡易な実装であり、affine arithmericとして bestを尽くしてはいない。
resize, append, splitはode solverで使っている特殊な関数
まだちゃんと書いてないので詳細はソースを見て欲しい。
int i; i = kv::affine<T>::maxnum();とすれば読み出せるし、
kv::affine<T>::maxnum() = 5;のようにすれば書き換えることも出来る。
あるまとまった計算を行い、 次にそれらとはまったく独立な (前の計算で作成されたaffine変数を一切使わない)別の計算を 行う場合、いったんダミー変数の最大数を0にリセットすると 計算の高速化が期待できる。 また、区間化するなどでダミー変数のいくつかが不要になった場合など、 ダミー変数の最大数を減らしたいことがある。 いずれにしても、ダミー変数の最大数の変更はaffine arithmeticの原理を よく理解した上で慎重に行う必要がある。