シェルスクリプトで2つの浮動小数点数を比較する方法

シェルスクリプトで2つの浮動小数点数を比較する方法

シェルスクリプトで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

浮動小数点数(+ - * /と比較)を使用した単純な計算には、awkを使用できます。

min=$(echo 12.45 10.35 | awk '{if ($1 < $2) print $1; else print $2}')

あるいは、ksh93またはzsh(bashではない)がある場合は、浮動小数点数をサポートするシェルの組み込み算術を使用できます。

if ((min>val)); then ((val=min)); fi

高度な浮動小数点計算を表示するには、次を見つけます。紀元前。実際には、任意精度の固定小数点数で動作します。

数値表で作業するには、次の項目を見つけます。はい)。

答え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

関連情報