Shell 스 크 립 트 처리 부동 소수점 연산 과 비교 인 스 턴 스

3756 단어
top 명령 을 통 해 보 이 는 프로 세 스 의 CPU, 메모리 사용량 의 백분율 은 부동 소수점 입 니 다. 스 크 립 트 를 쓸 때 처리 해 야 하기 때문에 배 웠 습 니 다. 요약 은 다음 과 같 습 니 다.
사실 Shell (여 기 는 Bash) 자체 가 부동 소수점 계산 을 처리 하 는 능력 은 없 지만 'bc' 라 는 높 은 정밀도 의 계산기 도 구 를 사용 하여 도 울 수 있 습 니 다. 또한 Bash 에서 'awk' 스 크 립 트 를 호출 하여 부동 소수점 연산 을 처리 할 수 있 습 니 다.
1. bc 로 계산 (정형 및 부동 소수점 계산 포함) bc ㎡ C An arbitrary precision calculator language (1) 를 처리 합 니 다. 보통 Bash 스 크 립 트 에서 bc 를 사용 하 는 범례 형식 은 variable = $(echo "OPTIONS; OPERATIONS"| bc [options]) 즉 echo "[options]; 조작"| bc [옵션] (2) 입 니 다. 아래 스 크 립 트 에서 첫 번 째 옵션 에서 "scale"을 언급 합 니 다.변 수 는 출력 에서 소수점 후의 정 도 를 나타 내 고 계산 결과 의 정 도 를 제어 할 수 있 습 니 다.'ibase' 와 'obase' 는 각각 입력 과 출력 데이터 의 진 도 를 나타 내 고 수치 진법 의 변환 에 사용 할 수 있 습 니 다.(3). 부동 소수점 비교, 예 를 들 어 "if [$(echo"$big > $small "| bc) - eq 1]"은 논리 적 판단 식 을 bc 에 파이프 로 전달 합 니 다.결과 가 진실 이 라면 1 을 출력 하고 그렇지 않 으 면 0 을 출력 한 후에 이 결 과 를 이용 하여 진일보 한 조작 을 할 수 있다.(4). bc 는 원래 하나의 파일 을 입력 으로 계산 하기 때문에 복잡 한 계산 을 파일 에 기록 한 다음 bc 도구 로 여기저기 계산 결 과 를 처리 할 수 있 습 니 다.주의: 나눗셈 연산 자/를 사용 할 때 소 수 를 유지 하려 면 scale 을 스스로 설정 해 야 합 니 다. 그렇지 않 으 면 기본적으로 scale, 소수점 후 0 자리 입 니 다.2. awk 를 사용 하여 부동 소수점 계산 과 부동 소수점 비교 처리
너무 많은 설명 을 하지 않 고 예제 스 크 립 트 를 다음 과 같이 썼 습 니 다. 이것 을 알 면 부동 소수점 계산 과 부동 소수점 비 교 를 어떻게 처리 하 는 지 알 수 있 습 니 다.
 
  
#!/bin/bash
# author: Jay
# some examples for playing with floating point number.

# basic usage of 'bc' tool in Bash.
a=3.33
b=3.3
c=$(echo "$a + $b" | bc)
d=$(echo "$a * $b" | bc)
e=$(echo "scale=5; $a / $b" | bc)
echo "c=a+b=$a+$b=$c"
echo "d=a*b=$a*$b=$d"
echo "e=a/b=$a/$b=$e"

# "-l" parameter for 'bc' means using math library.
pi=$(echo "scale=10; 4*a(1)" | bc -l)
s=$(echo "s($pi/6)" | bc -l)
echo "pi=$pi"
echo "s=sin(pi/6)=$s"

# use more options of 'bc' tool
r=$(echo 'ibase=10;obase=2; 15+16' | bc)
echo "binary of (15+16) is $r"

# comparison for floating point numbers using 'bc'
big=100
small=99.9
if [ $(echo "$big > $small" | bc) -eq 1 ]; then
        echo "$big is bigger than $small"
fi

# deal with floating point numbers with 'awk' language
echo $(awk -v x=10 -v y=2.5 'BEGIN {printf "10/2.5=%.2f
",x/y}')
v=$(echo $big $small | awk '{ printf "%0.8f
" ,$1/$2}')
echo "$big / $small = $v"

echo $big $small | awk '{if($1>$2) {printf"%f > %f
",$1,$2} else {printf"%f

执行的结果如下:


master@jay-linux:~/workspace/mygit/shell/sh2012$ ./floating-point.sh
c=a+b=3.33+3.3=6.63
d=a*b=3.33*3.3=10.98
e=a/b=3.33/3.3=1.00909
pi=3.1415926532
s=sin(pi/6)=.49999999994373819220
binary of (15+16) is 11111
100 is bigger than 99.9
10/2.5=4.00
100 / 99.9 = 1.00100100
100.000000 > 99.900000

另外,bc处理一个文件中的计算逻辑,演示如下:

master@jay-linux:~/workspace/mygit/shell/sh2012$ cat temp.bc
3+8
3/8
scale=2; 3/8

master@jay-linux:~/workspace/mygit/shell/sh2012$ bc -q temp.bc
11
0
.37

bc是强大的工具,请“man bc”查看详情;同样,请“man awk”。

 

좋은 웹페이지 즐겨찾기