Program Tip

선행 0을 인쇄하려면 bc (1)을 어떻게 얻습니까?

programtip 2020. 12. 15. 19:46
반응형

선행 0을 인쇄하려면 bc (1)을 어떻게 얻습니까?


Makefile에서 다음과 같은 작업을 수행합니다.

echo "0.1 + 0.1" | bc

(물론 실제 파일에서 숫자는 동적입니다)

그것은 인쇄 .2하지만 인쇄 하고 싶습니다 0.2.

의지하지 않고이 작업을 수행하고 sed싶지만 bc0을 인쇄하는 방법을 찾을 수없는 것 같습니다 . 아니면 bc그냥 할 수 없습니까?


awk를 사용하여 형식을 지정할 수도 있습니다.

 echo "0.1 + 0.1" | bc | awk '{printf "%f", $0}'

또는 awk 자체로 수학을 수행합니다.

 echo "0.1 0.1" | awk '{printf "%f", $1 + $2}'

이것은 당신을 위해 일할 수 있습니다.

echo "x=0.1 + 0.1; if(x<1) print 0; x" | bc

소스를 빠르게 살펴본 후 ( bc_out_num()1461 행 참조 ) 0정수 부분이이면 행간 을 인쇄 하는 명확한 방법을 알 수 없습니다 0. 내가 놓친 것이 아니라면이 동작은 명령 줄 플래그를 사용하여 변경할 수있는 매개 변수에 의존하지 않습니다.

짧은 대답 : 아니요 bc. 원하는 방식으로 숫자 인쇄 할 수있는 방법이 없다고 생각 합니다.

sed여전히을 사용하고 싶다면 사용 하는 데 잘못된 것이 없습니다 bc. 다음은 IMHO, 그렇게 무시 무시하게 보이지 않습니다.

[me@home]$ echo "0.1 + 0.1" | bc | sed 's/^\./0./'
0.2

당신이 정말로 피하고 싶은 경우 sed, 모두 eljunior의choroba의 제안은 멋지다,하지만 그들은 0을 후행 피하기 위해 값에 의존하는 조정이 필요합니다. 그것은 당신에게 문제가 될 수도 있고 아닐 수도 있습니다.


문서에서 출력 형식에 대해 아무것도 찾을 수 없습니다. sed 대신 printf에 도달 할 수도 있습니다.

printf '%3.1f\n' $(bc<<<0.1+0.1)

$ bc -l <<< 'x=-1/2; if (length (x) == scale (x) && x != 0) { if (x < 0) print "-",0,-x else print 0,x } else print x'

이것은 순수 bc합니다. 의 결과를 식의 length비교하여 선행 0을 감지합니다 scale. 양수와 음수 모두에서 작동합니다.


이것은 또한 음수를 처리합니다.

echo "0.1 - 0.3" | bc | sed -r 's/^(-?)\./\10./'

echo "$a / $b" | bc -l | sed -e 's/^-\./-0./' -e 's/^\./0./'

결과가 다음과 같은 모든 경우에 적용됩니다.

  • "-.123"
  • ".123"
  • '-1.23'
  • '1.23'

설명:

  1. 단지 시작 모든 것을 들어 -., 교체 -.-0.

  2. 단지 시작 모든 것을 들어 ., 교체 .0.


양수의 경우 (문자열) 0을 인쇄하는 것처럼 간단 할 수 있습니다.

$ echo '"0";0.1+0.1' | bc
0.2

숫자가 1보다 크거나 같으면 0을 피하십시오.

$ echo 'x=0.1+0.1;  if(x<1){"0"};  x' | bc
0.2

숫자가 음수이면 조금 더 복잡해집니다.

echo 'x= 0.3 - 0.5 ; s=1;if(x<0){s=-1};x*=s;if(s<0){"-"};if(x<1) {"0"};x' | bc
-0.2

함수를 정의하고 라이브러리에 추가 할 수 있습니다.

$ echo 'define leadzero(x){auto s;
        s=1;if(x<0){s=-1};x*=s;if(s<0){"-"};if(x<1){"0"};
        return(x)};
        leadzero(2.1-12.4)' | bc
-10.3

$ echo 'define leadzero(x){auto s;
        s=1;if(x<0){s=-1};x*=s;if(s<0){"-"};if(x<1){"0"};
        return(x)};
        leadzero(0.1-0.4)' | bc
-0.3

이것은 bc 만 사용하고 음수로 작동합니다.

bc <<< "x=-.1; if(x==0) print \"0.0\" else if(x>0 && x<1) print 0,x else if(x>-1 && x<0) print \"-0\",-x else print x";

시도해보십시오 :

for y in "0" "0.1" "-0.1" "1.1" "-1.1"; do
  bc <<< "x=$y; if(x==0) print \"0.0\" else if(x>0 && x<1) print 0,x else if(x>-1 && x<0) print \"-0\",-x else print x";
  echo;
done

아마도 bc현대 시대를위한 최고의 "벤치 계산기"는 아닐 것입니다. 다른 언어는 더 많은 제어를 제공합니다. 다음은 선행 0으로 범위 (-1.0 .. + 1.0)의 값을 인쇄하는 작업 예제입니다. 이러한 예는 사용 bc, AWK하고 Python 3.

#!/bin/bash

echo "using bc"
time for (( i=-2; i<=+2; i++ ))
   {
   echo $(bc<<<"scale=1; x=$i/2; if (x==0||x<=-1||x>=1) { print x } else { if (x<0) { print \"-0\";-x } else { print \"0\";x } } ")
   }
echo

echo "using awk"
time for (( i=-2; i<=+2; i++ ))
   {
   echo $(echo|awk "{printf \"%.1f\",$i/2}")
   }  
echo

echo "using Python"
time for (( i=-2; i<=+2; i++ ))
   {
   echo $(python3<<<"print($i/2)")
   }

Note that the Python version is about 10x slower, if that matters.


Building on potongs answer,

For fractional results:

echo "x=0.1 + 0.1; if(x<1 && x > 0) print 0; x" | bc -l

Note that negative results will not be displayed correctly. Aquarius Power has a solution for that.

ReferenceURL : https://stackoverflow.com/questions/8402181/how-do-i-get-bc1-to-print-the-leading-zero

반응형