シェル

シェル

数値に基づいて縦横比の高さを計算していますx。この例では、4:3の比率を使用し、幅は800です。結果(高さ)は600でなければなりませんが、bashは800を返しますが、その理由はわかりません。

他の言語を試してみましたが、ほとんど問題があるようです。 PHPは動作する数少ない言語の1つであるようです。

PHP(600リターン)

php -r 'echo 800/(4/3);'

Python(800リターン)

python -c "print(800/(4/3))"

bc -l少し動作します(600.00000000000000000150戻り)

-l「標準数学ライブラリ定義」です。どういう意味なのかわかりませんが、目標に近づくようです。しかし、追加の0と150はどこから来ますか?

echo '800 / (4 / 3)' | bc -l

私はこれが浮動小数点処理または切り捨てに関連していると推測します3/4

これで使用できますがphp、比較的簡単な計算にはやや過剰なようです。ここで何が起こっているのか知っていますか?

ベストアンサー1

Bash算術は整数にのみ適用されます。したがって、4/3は1を返します。 800/1は800です。

入力を制御できる場合は、分割する前に再構成して乗算を実行できます。

$ echo $(( 800*3/4 ))
600

他の例も「整数」です。たとえば、4交換によってPythonを強制的に浮動状態にすると、4.0他の答えが得られます(Python 3ではこれを要求しません)。

$ python -c "print(800/(4.0/3))"
600.0

bc -l標準の数学ライブラリがロードされますが(s()サイン、l()自然ログなどの関数を含む)、より重要なのはscaleここで20に設定されることです。scale除算で下数を生成した後、小数点以下の桁数が何桁か定義するので(実際には)が4/3出て、これが出る理由を説明します。1.33333333333333333333133333333333333333333/1e+20600.00000000000000000150

echo 'scale=1000; 800/(4/3)' | bc

(数学ライブラリをロードせずに)より高い精度を提供しますが、10進数で表現できない600ため、目標に到達することはできません。4/3

おすすめ記事