쉘 스크립트에서 두 개의 부동 소수점 숫자를 비교하고 싶습니다. 다음 코드는 작동하지 않습니다.
#!/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
해킹이 있습니다. 문자열 비교가 왼쪽에서 오른쪽으로 이해되도록 정수에 선행 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