数値を表す文字列の総和あるいは総積を求めるユーティリティ: aggregate_numbers()
char *aggregate_numbers(Aggregate_e_opcode opcode
, const char **numerals
, size_t n_numerals
, ssize_t scale
);
numerals には数値を表す文字列それぞれのアドレスを収めたポインタ配列のアドレスを指定します。指定した配列から指し示される数値文字列すべてについての演算を行います。
n_numerals には numerals に指定したポインタ配列の要素数、つまり、総和を求める数値文字列の個数を指定します。
opcode に Aggregate_e_opcode_add を指定すると数値文字列すべての和 倍numerals[n] ; 0 ≦ n ≦ (n_numerals - 1)} を演算します。
opcode に Aggregate_e_opcode_sub を指定すると最初の数値文字列から残りのすべての数字文字列を差し引いた値 numerals[0] - 倍numerals[n] ; 1 ≦ n ≦ (n_numerals - 1)} を演算します。
opcode に Aggregate_e_opcode_mul を指定すると数値文字列すべての積 Π{numerals[n] ; 0 ≦ n ≦ (n_numerals - 1)} を演算します。
scale にゼロ以上の正数で小数点桁数を指定することで演算結果の精度を制御できます(ゼロを指定すると演算結果は整数になります)。
scale に負数を指定した場合、opcode が Aggregate_e_opcode_add か Aggregate_e_opcode_sub であれば numerals に指定した数値文字列の中で最大の小数点桁数で演算します。opcode が Aggregate_e_opcode_mul であれば numerals に指定した数値文字列すべての小数点桁数の総和に等しい精度で演算します。
注意 opcode に aggregate_e_opcode_mul を指定した場合、numerals に指定した数値文字列の個数が多くなると、演算途中で獲得する動的メモリが不足したり、処理に長大な時間がかかってしまう恐れがあります。opcode に Aggregate_e_opcode_mul を指定する場合は、一度に多くの数値文字列を numerals に指定しないように注意してください。
正常終了した場合、演算結果を表す数値文字列を収めた動的メモリのアドレスが返されます。返されたアドレスを destroy_aggregate_numbers() に渡すことでメモリ解放します。
なんらかのエラーが発生した場合は、戻り値に NULL が返ります。発生したエラーの詳細は以下のように errno に出力されます。
- EINVAL (= 22) : 不正な引数が渡された場合
- ENOMEM (= 12) : 作業メモリに割り当てる動的メモリが獲得できない場合 (システムメモリ不足)