Shell 스 크 립 트 처리 부동 소수점 연산 과 비교 인 스 턴 스
사실 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”。 
  
  
 
  
   
  
 이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.