シェルスクリプトで2つの浮動小数点数を比較したいと思います。次のコードは機能しません。
#!/bin/bash
min=12.45
val=10.35
if (( $val < $min )) ; then
min=$val
fi
echo $min
答え1
Bashは浮動小数点演算を理解していません。小数点を含む数値を文字列として扱います。
代わりにawkまたはbcを使用してください。
#!/bin/bash
min=12.45
val=10.35
if [ 1 -eq "$(echo "${val} < ${min}" | bc)" ]
then
min=${val}
fi
echo "$min"
数学の多くを計画している場合は、PythonやPerlを使用することをお勧めします。
答え2
パッケージをご利用ください。デジタルユーティリティ 簡単な作業のために...
より深刻な数学については、以下を参照してください。このリンク...たとえば、いくつかのオプションについて説明します。
一例numprocess
echo "123.456" | numprocess /+33.267,%2.33777/
# 67.0395291239087
A programs for dealing with numbers from the command line
The 'num-utils' are a set of programs for dealing with numbers from the
Unix command line. Much like the other Unix command line utilities like
grep, awk, sort, cut, etc. these utilities work on data from both
standard in and data from files.
Includes these programs:
* numaverage: A program for calculating the average of numbers.
* numbound: Finds the boundary numbers (min and max) of input.
* numinterval: Shows the numeric intervals between each number in a sequence.
* numnormalize: Normalizes a set of numbers between 0 and 1 by default.
* numgrep: Like normal grep, but for sets of numbers.
* numprocess: Do mathematical operations on numbers.
* numsum: Add up all the numbers.
* numrandom: Generate a random number from a given expression.
* numrange: Generate a set of numbers in a range expression.
* numround: Round each number according to its value.
ここにbash
ハッキングがあります。文字列比較が左から右に理解されるように、整数に先行ゼロを追加します。この特定のコードには両方が必要です。 分そして足実際には小数点と少なくとも1つの小数点桁があります。
min=12.45
val=10.35
MIN=0; VAL=1 # named array indexes, for clarity
IFS=.; tmp=($min $val); unset IFS
tmp=($(printf -- "%09d.%s\n" ${tmp[@]}))
[[ ${tmp[VAL]} < ${tmp[MIN]} ]] && min=$val
echo min=$min
出力:
min=10.35
答え3
答え4
数字で並べ替え
このコマンドには、最小値または最大値を見つけて「より小さい」または「より大きい」を比較するために使用できるsort
オプション-g
()があります。--general-numeric-sort
<
>
次の例では、最小値を探します。
$ printf '12.45\n10.35\n' | sort -g | head -1
10.35
電子表記法のサポート
電子表現など、非常に一般的な浮動小数点数値表現と連携します。
$ printf '12.45E-10\n10.35\n' | sort -g | head -1
12.45E-10
E-10
最初の数字0.000000001245
は実際に10.35
。
無限大と比較
浮動小数点標準、IEEE754、いくつかの特殊値を定義します。これらの比較で興味深いのはINF
無限大です。負の無限大もあります。どちらも標準で明確に定義された値です。
$ printf 'INF\n10.35\n' | sort -g | head -1
10.35
$ printf '-INF\n10.35\n' | sort -g | head -1
-INF
sort -gr
代わりに最大の用途を見つけるには、sort -g
ソート順を逆にします。
$ printf '12.45\n10.35\n' | sort -gr | head -1
12.45
比較演算
<
などで使用できるように(「より小さい」)比較を実装するには、if
最小値を値の1つと比較します。最小値がこの値と等しい場合、テキストで比較、これは他の値よりも小さいです。
$ a=12.45; b=10.35
$ [ "$a" = "$(printf "$a\n$b\n" | sort -g | head -1)" ]
$ echo $?
1
$ a=12.45; b=100.35
$ [ "$a" = "$(printf "$a\n$b\n" | sort -g | head -1)" ]
$ echo $?
0