Pregunta

Tengo dos funciones para GNU bc en 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

Ambas funciones funcionan bien en BC interactiva. bc no parece permitir que múltiples funciones en una línea separados por; aunque, por lo que tengo que echo -n | bc con saltos de línea al final de cada función. La salida es por encima de 2,5, no el 3.0 se espera que consigo si escribo en bc -i mí mismo. Parece que las llamadas de bash bc para cada línea de salida de eco, en lugar de echo'ing todo a una sola instancia. ¿Hay alguna solución para esto?

¿Fue útil?

Solución

La escala tiene que ser cero para x%1 de trabajo. Normalmente se debe sólo tienen un retorno de una función.

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 }

Esto necesita una nueva línea después de la declaración de escala:

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

Otros consejos

Creo 1. es incorrecta. Las necesidades de comparación if() sean X >= 0.

Me parece obras

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)                
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top