'e' 言語には 'ilog2' 関数がありますが、'ceiling of log2' タイプの関数が必要です。これを行う最善の方法は何ですか?
システム コマンドから Perl を起動し、POSIX::ceil を使用できます...
'e' 言語には 'ilog2' 関数がありますが、'ceiling of log2' タイプの関数が必要です。これを行う最善の方法は何ですか?
システム コマンドから Perl を起動し、POSIX::ceil を使用できます...
私は次のようなことをしたでしょう:
ceil_log2(in : uint): uint is {
var bottom := ilog2(in);
result = (in == ipow(2,bottom)) ? bottom : bottom + 1;
};
perl スクリプトを呼び出すと、計算コストが高くなる場合があります。代わりに、0.5 を log2 に追加し、typecast (e-language がサポートしているかどうか不明) を整数に追加します。
別の試み:
Let y = ilog2(x);
if ((x & x-1) == 0) //Check if x is power of 2
return y;
else
return y+1;
実際にやっても構わない場合:
ceil_log2(in: uint): uint is {
result = ceil(log10(in)/log10(2)).as_a(uint);
};