2210
Comment: spam
|
126
3.33333333333333
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
<<Anchor(faq22)>> == How can I calculate with floating point numbers instead of just integers? == [[BASH]] does not have built-in floating point [[ArithmeticExpression|arithmetic]]: {{{ $ echo $((10/3)) 3 }}} Bash cannot do ''anything'' with floating point numbers, ''including'' compare them to each other(*). Instead, an external program must be used, e.g. {{{bc}}}, {{{awk}}} or {{{dc}}}: {{{ $ echo "scale=3; 10/3" | bc 3.333 }}} The "scale=3" command notifies {{{bc}}} that three digits of precision after the decimal point are required. If you are trying to compare floating point numbers, be aware that a simple ''x < y'' is not supported by all versions of {{{bc}}}. {{{ # This would work with some versions, but not HP-UX 10.20. # The here string feature, inherited from rc->zsh->ksh93 was # introduced in bash 2.05b-alpha1 imadev:~$ bc <<< '1 < 2' syntax error on line 1, }}} Alternatively, you could use this: {{{ # Bash if [[ $(bc <<< "1.4 - 2.5") = -* ]]; then echo "1.4 is less than 2.5." fi }}} This example subtracts 2.5 from 1.4, and checks the sign of the result. If it is negative, the first number is less than the second. Portable version: {{{ # Bourne case "`echo "1.4 - 2.5" | bc`" in -*) echo "1.4 is less than 2.5";; esac }}} [[AWK]] can be used for calculations, too: {{{ $ awk 'BEGIN {printf "%.3f\n", 10 / 3}' 3.333 }}} There is a subtle but important difference between the {{{bc}}} and the {{{awk}}} solution here: {{{bc}}} reads commands and expressions from ''standard input''. {{{awk}}} on the other hand evaluates the expression as ''part of the program''. Expressions on standard input are ''not'' evaluated, i.e. {{{echo 10/3 | awk '{print $0}'}}} will print {{{10/3}}} instead of the evaluated result of the expression. Newer versions of zsh and the KornShell have built-in floating point arithmetic, together with mathematical functions like {{{sin()}}} or {{{cos()}}} . (*)Actually, I lied. It can print them, using {{{printf}}} and one of the {{{%e}}} or {{{%f}}} or {{{%g}}} format strings. But that's all. |
Wow! Sentimental and nostalgic. wine Yes! http://necklacepash.wikidot.com/system:page-tags/tag/vodka potatoes, Well done.. |
Wow! Sentimental and nostalgic. wine Yes! http://necklacepash.wikidot.com/system:page-tags/tag/vodka potatoes, Well done..