2

BashスクリプトにはGNUbc用の2つの関数があります。

BC_CEIL="define ceil(x) { if (x>0) { if (x%1>0) return x+(1-(x%1)) else return x } else return -1*floor(-1*x) }\n"
BC_FLOOR="define floor(x) { if (x>0) return x-(x%1) else return -1*ceil(-1*x) }\n"
echo -e "scale=2"$BC_CEIL$BC_FLOOR"ceil(2.5)" | bc

両方の関数は、インタラクティブbcで正常に機能します。bcは、;で区切られた1行に複数の関数を許可していないようです。ただし、エコーする必要があります-n | 各関数の最後に改行を含むbc。上記の出力は2.5であり、自分でbc-iと入力した場合に期待される3.0ではありません。bashは、すべてを1つのインスタンスにエコーするのではなく、エコー出力の各行に対してbcを呼び出すようです。これに対する回避策はありますか?

4

2 に答える 2

2

スケールが機能するには、ゼロである必要がありますx%1。通常、関数からの戻り値は1つだけです。

define ceil(x) { auto savescale; savescale = scale; scale = 0; if (x>0) { if (x%1>0) result = x+(1-(x%1)) else result = x } else result = -1*floor(-1*x);  scale = savescale; return result }
define floor(x) { auto savescale; savescale = scale; scale = 0; if (x>0) result = x-(x%1) else result = -1*ceil(-1*x);  scale = savescale; return result }

これには、scaleステートメントの後に改行が必要です。

echo -e "scale=2\n"$BC_CEIL$BC_FLOOR"ceil(2.5)" | bc
于 2010-04-28T05:57:34.577 に答える
2

1.は間違っていると思います。比較はif()である必要があります X >= 0

私はこれがうまくいくと思います

define ceil(x) {                         
    if (x >= 0) { if (x%1>0) return x+(1-(x%1)) else return x } 
    else return -1*floor(-1*x)               
}
define floor(x) {                        
    if (x >= 0) return x-(x%1)               
    else return -1*ceil(-1*x)                
}
于 2011-07-21T20:34:58.710 に答える