bc는 로그 및 계승 계산을 지원하지 않습니까?


17

다른 명령 행 계산기 즉 지원 있는가 log, n!계산은? 적어도 bc그렇게 할 수는 없습니다. 오류를 파싱했습니다.

스크립트를 사용할 수 있다면 가장 좋습니다. 예 : echo '5!' | program

답변:


20

bc-l플래그 와 함께 호출 된 경우 자연 로그를 지원합니다 . base-10 또는 base-2 로그를 계산할 수 있습니다.

$ bc -l
...
l(100)/l(10)
2.00000000000000000000

l(256)/l(2)
8.00000000000000000007

나는 기본적으로 계승이 있다고 생각하지 않지만 스스로 작성하기에는 충분합니다.

$ bc
...
define fact_rec (n) { 
  if (n < 0) {
    print "oops";
    halt;
  }
  if (n < 2) return 1;
  return n*fact_rec(n-1);
}
fact_rec(5)
120

또는:

define fact_it (n) {
  if (n < 0) {
    print "oops";
    halt;
  }
  res = 1;
  for (; n > 1; n--) {
    res *= n;
  }
  return res;
}
fact_it(100)
93326215443944152681699238856266700490715968264381621468592963895217\
59999322991560894146397615651828625369792082722375825118521091686400\
0000000000000000000000

POSIX를 준수하려면 다음을 작성해야합니다.

define f(n) {
  auto s, m
  if (n <= 0) {
    "Invalid input: "
    n
    return(-1)
  }
  s = scale
  scale = 0
  m = n / 1
  scale = s
  if (n != m) {
    "Invalid input: "
    n
    return(-1)
  }
  if (n < 2) return(1)
  return(n * f(n - 1))
}

즉, 단일 문자 함수 이름, 아니오 print, 아니오 halt, 괄호가 필요합니다 return(x). 입력 유효성 검사가 필요하지 않은 경우 (여기 양의 정수의 경우) 다음과 같습니다.

define f(n) {
  if (n < 2) return(1)
  return(n * f(n - 1))
}

1
음수 또는 0을 지정하면 n == 1을 검사하면 무한 루프가 발생합니다. bc 맨 페이지에서와 같이 대신 n <= 1을 사용하십시오. 실제로 en.wikipedia.org/wiki/ 에 따르면 음수의 오류를 반환해야합니다. 이것은 계승을 계산하기 위해 재귀에 사용하는 것으로 알려진 문제입니다.
cas

이것은 계승의 완벽한 구현에 대한 연구가 아니며 bc가 재귀 함수를 포함한 함수를 가지고 있음을 보여주는 간단한 데모입니다.
Mat

사실, 누군가 언젠가 그 예제 함수를 읽고 "좋아요, 어떻게해야할지 궁금합니다"라고 말하고 사용할 것입니다. BTW, 난 지금까지 당신이하고 여전히 컴퓨터 괴짜가 될 수와 같은 수학이 괴짜 약 해요 ...하지만 난이 오류가 수정 된 이후 나는 :) 내가 더 먼저 조금 연구를 할 거라고 생각
CAS

알았어. 올바른 재귀 및 반복 버전 ...
Mat

정확하지 않습니다 : 0!=1, 1!=1. 적어도 위키피디아는 그렇게 말합니다.
cas

4

Orpie는 이다 계산기와 명령 줄 괴짜 계산기. 최신 HP RPN 계산기를 에뮬레이트합니다. 물론 이는 계산하는 유일한 방법입니다.

TI, Casios 등에서 제기 된 계산기 이단자 인 경우 온라인으로 재교육을 시작할 수있는 많은 RPN 자습서가 있습니다. RPN 사고 방식을 익히면 Orpie 매뉴얼 이 결국 사용됩니다.

5를 계산하려면! Orpie에서 작성하는대로 입력하십시오 5 !. Enter그 사이를 눌러 5스택에 먼저 밀어 넣을 수 있지만 반드시 그럴 필요는 없습니다.

로그 10 (5) 을 계산하려면을 입력하십시오 5 Enter ' l o Enter. 5다음 키 스트로크는 연산자가 아니기 때문에이 경우에는 스택을 먼저 밀어야합니다 . 작은 따옴표 문자는 명령 약어 모드로 들어가서 입력을 시작할 log10수 있으며 처음 두 문자만으로 고유하게 식별 할 수 있습니다. ( l혼자서 ln대신 자연 로그 기능을 얻을 수 있습니다 .)

어떤 RPN 계산기와 마찬가지로, 당신이 얻을 수있는 정말 연습의 비트와 함께, 빠른 Orpie와.

Orpie는 재고 Ubuntu repos에 있습니다. FreeBSD는 다음과 같이 포트에 포함합니다 math/orpie. OS X에서는 Homebrew를 통해 설치할 수 있습니다 . 다른 OS에서 타사 패키지를 사용할 수 있습니다. OCaml 로 작성 되었으므로 OCaml 개발 환경이 설치되어 있지 않기 때문에 소스에서 빌드하는 것은 다소 번거로울 수 있습니다 . 하나의 설정을 얻는 것이 특히 어렵지는 않습니다.


2

명령 줄 계산기의 이맥 인 GNU Octave 는 항상 존재합니다 (계산기에 내장 된 완전한 개발 환경과 프로그래밍 언어 및 수천 개의 선택적 애드온을 원할 때)

또는 R 통계는 더 일이 있다면.

나는 대부분은 단지 사용하는 bc -l난이 ... 표준 수학 라이브러리가로드 얻을 수 bc별칭 bc -l. bc매뉴얼 페이지를 다음과 같이 정의 하지만 계승 함수 정의에 대한 정보는 Mat의 답변을 참조하십시오 .

define f (x) {
  if (x <= 1) return (1);
  return (f(x-1) * x);
}

== 1이 아닌 <= 1을 확인하면 음수 (오류 여야 함) 또는 0 (유효)을 공급할 경우 무한 루프가 방지됩니다.


1

내가 가장 좋아하는 것은 가볍고 간단 W-Calc합니다. http://w-calc.sourceforge.net

명령을 수동으로 보거나 수동으로 수동으로 다시 만들 필요가 없습니다 bc. 명령은 대부분 정확히 예상 한 것이므로 원하는 것을 입력하면 작동합니다. 귀하의 질문에 따라 테스트 - 실제로 log()n!작업 예상대로.

(물론 나는 Orpie에 대해 들어 보지 못했습니다. 더 나은 옵션 일 수 있습니다.)


0

완전히 과잉이지만 프로그래밍 언어 통역사는 결국 명령 줄 계산기입니다.

$ echo 5 | python -c 'import sys; import math; print math.factorial(int(sys.stdin.readline()));'
120

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.