쉘 스크립트에서 두 개의 부동 소수점 숫자를 비교하는 방법

쉘 스크립트에서 두 개의 부동 소수점 숫자를 비교하는 방법

쉘 스크립트에서 두 개의 부동 소수점 숫자를 비교하고 싶습니다. 다음 코드는 작동하지 않습니다.

#!/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

패키지를 이용하시면 됩니다디지털 유틸리티 간단한 작업을 위해...

더 심각한 수학에 대해서는 다음을 참조하십시오.이 링크...예를 들어 몇 가지 옵션을 설명합니다.

  • R/R 스크립트(GNU R 통계 컴퓨팅 및 그래픽 시스템)
  • 옥타브(주로 Matlab과 호환)
  • bc(GNU bc 임의 정밀도 계산기 언어)

한 가지 예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해킹이 있습니다. 문자열 비교가 왼쪽에서 오른쪽으로 이해되도록 정수에 선행 0을 추가합니다. 이 특정 코드에는 두 가지가 모두 필요합니다. 그리고실제로 소수점과 적어도 하나의 소수점 자리가 있습니다.

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최소값을 값 중 하나와 비교하십시오. 최소값이 이 값과 같을 경우,텍스트로 비교, 이는 다른 값보다 작습니다.

$ 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

관련 정보