Question

J'ai deux fonctions pour GNU bc dans un script Bash.

BC_CEIL="define ceil(x) { if (x>0) { if (x%1>0) return x+(1-(x%1)) else return x } else return -1*floor(-1*x) }\n"
BC_FLOOR="define floor(x) { if (x>0) return x-(x%1) else return -1*ceil(-1*x) }\n"
echo -e "scale=2"$BC_CEIL$BC_FLOOR"ceil(2.5)" | bc

Les deux fonctions fonctionnent très bien en Colombie-Britannique interactive. bc ne semble pas permettre de multiples fonctions sur une ligne séparée par; , donc je dois echo -n | bc avec sauts de ligne à la fin de chaque fonction. La sortie ci-dessus est de 2,5, pas le 3.0 attendu que je reçois si je tape dans moi-même bc -i. Il semble que les appels bash bc pour chaque ligne d'écho sortie, plutôt que echo'ing tout à une seule instance. Y at-il solution de contournement pour cela?

Était-ce utile?

La solution

L'échelle doit être zéro pour x%1 au travail. Vous devriez normalement avoir qu'un seul retour d'une fonction.

define ceil(x) { auto savescale; savescale = scale; scale = 0; if (x>0) { if (x%1>0) result = x+(1-(x%1)) else result = x } else result = -1*floor(-1*x);  scale = savescale; return result }
define floor(x) { auto savescale; savescale = scale; scale = 0; if (x>0) result = x-(x%1) else result = -1*ceil(-1*x);  scale = savescale; return result }

Il a besoin d'une nouvelle ligne après la déclaration de l'échelle:

echo -e "scale=2\n"$BC_CEIL$BC_FLOOR"ceil(2.5)" | bc

Autres conseils

Je crois que 1. est incorrect. Les besoins de comparaison de if() pour être X >= 0.

Je trouve cela fonctionne

define ceil(x) {                         
    if (x >= 0) { if (x%1>0) return x+(1-(x%1)) else return x } 
    else return -1*floor(-1*x)               
}
define floor(x) {                        
    if (x >= 0) return x-(x%1)               
    else return -1*ceil(-1*x)                
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top