bc ne prend pas en charge le calcul logarithmique et factoriel?


17

Est - il un autre calculateur de ligne de commande qui prend en charge log, les n!calculs? Au moins, bcje ne peux pas faire ça, ça m'a dit une erreur d'analyse

Il vaut mieux utiliser un script, par exemple echo '5!' | program

Réponses:


20

bcprend en charge le logarithme naturel s'il est invoqué avec l' -lindicateur. Vous pouvez calculer le journal base-10 ou base-2 avec lui:

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

l(256)/l(2)
8.00000000000000000007

Je ne pense pas qu'il y ait une factorielle intégrée, mais c'est assez facile de vous écrire:

$ 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

Ou:

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

Pour être conforme à POSIX, vous devez l'écrire:

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))
}

C'est-à-dire: nom de la fonction à un caractère, non print, non halt, parenthèses requises dans return(x). Si vous n'avez pas besoin de validation d'entrée (ici pour les nombres entiers positifs), c'est juste:

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

1
la vérification de n == 1 entraîne une boucle sans fin si vous lui donnez un nombre négatif ou zéro. utilisez n <= 1 à la place comme dans la page de manuel bc. Vraiment, cependant, il devrait retourner une erreur de nombres négatifs - selon en.wikipedia.org/wiki/… c'est un problème connu avec l'utilisation de la récursivité pour calculer les factorielles.
cas

il ne s'agit pas d'une étude sur l'implémentation parfaite de factorielle, mais d'une simple démonstration pour montrer que bc a des fonctions, y compris des fonctions récursives.
Mat

vrai, mais quelqu'un lira un jour cet exemple de fonction et dira "génial, je me demandais comment faire" et l'utiliser. BTW, je suis loin d'être un geek des mathématiques comme vous pouvez l'être et d'être toujours un geek informatique ... mais puisque je corrigeais une erreur, je pensais que je ferais mieux de faire un peu de recherche d'abord :)
cas

Ok, voilà. Corriger les versions récursives et itératives ...
Mat

pas tout à fait correct:, 0!=1tout comme 1!=1. C'est du moins ce que dit Wikipédia.
cas

4

Orpie est la calculatrice pour les geeks calculatrice et ligne de commande. Il émule une calculatrice HP RPN moderne, qui est bien sûr la seule vraie façon de calculer.

Si vous êtes un calculateur hérétique, élevé sur les TI, les Casios, etc., il existe de nombreux tutoriels RPN en ligne avec lesquels vous pouvez commencer votre rééducation. Le manuel Orpie vous sera éventuellement utile une fois que vous aurez compris la façon de penser du RPN.

Pour calculer 5! dans orpie, il suffit de taper comme vous rédigeriez: 5 !. Vous pouvez appuyer Enterentre eux pour pousser d'abord 5sur la pile, mais ce n'est pas nécessaire.

Pour calculer le journal 10 (5), tapez 5 Enter ' l o Enter. Vous devez d'abord pousser le 5sur la pile dans ce cas, car la prochaine frappe n'est pas un opérateur. Ce caractère guillemet simple entre en mode abréviation de commande, ce qui vous permet de commencer à taper log10, que vous pouvez identifier uniquement avec les deux premiers caractères uniquement. ( lseul, vous obtenez la fonction de journal naturel à la lnplace.)

Comme avec n'importe quelle calculatrice RPN, vous pouvez être très rapide avec Orpie, avec un peu de pratique.

Orpie est dans le référentiel Ubuntu. FreeBSD l'inclut dans les ports, comme math/orpie. Sous OS X, vous pouvez l'installer via Homebrew . Des packages tiers peuvent être disponibles pour d'autres systèmes d'exploitation. La construction à partir des sources peut être un peu une corvée, car elle est écrite en OCaml , et vous n'avez probablement pas installé un environnement de développement OCaml. Cependant, l'installation d'une configuration n'est pas particulièrement difficile.


2

Il y a toujours GNU Octave , les emacs des calculatrices en ligne de commande (pour quand vous voulez un environnement de développement complet et un langage de programmation intégré à votre calculatrice, et des milliers de modules complémentaires optionnels)

ou R si les statistiques sont plus votre truc.

Je l'utilise principalement bc -lpour charger la bibliothèque mathématique standard ... J'ai même un bcalias pour bc -l. Voir la réponse de Mat pour plus d'informations sur la définition d'une fonction factorielle .... bien que la bcpage de manuel la définit comme:

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

La vérification de <= 1 plutôt que == 1 empêche une boucle sans fin si vous lui fournissez un nombre négatif (devrait être une erreur) ou zéro (valide).


1

Mon préféré est le poids léger, simple W-Calc. http://w-calc.sourceforge.net

Vous n'avez pas besoin de regarder dans le manuel ou de recréer manuellement des fonctions communes, comme vous le faites avec bc- les commandes sont généralement exactement ce que vous attendez, alors tapez simplement ce que vous voulez et cela fonctionne. Test selon votre question - en effet log()et n!fonctionne comme prévu.

(Certes, je n'ai pas entendu parler d'Orpie - très bien peut-être une meilleure option.)


0

Totalement exagéré, mais les interprètes de langage de programmation sont des calculateurs de ligne de commande après tout:

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

-1

Si vous avez des ports Mac:

$ sudo /opt/local/bin/port install orpie
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.