Differences between revisions 48 and 54 (spanning 6 versions)
Revision 48 as of 2008-12-07 12:02:56
Size: 2210
Editor: pgas
Comment: spam
Revision 54 as of 2008-12-15 08:39:42
Size: 349
Editor: cc809084-b
Comment: 167.333333333333
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.
Hello admin. Funny you mentioned that you lost a few days before the accident potatoes I've basically been doing nothing , but I guess it doesn't bother me. http://usuarios.lycos.es/careygg/recipe617.html wine for, http://marquislm.kilu.de/reciped51.html recipe fraction, http://golonkaeg.servik.com/recipe601.html recipe, Anyway, All the Best.

Hello admin. Funny you mentioned that you lost a few days before the accident potatoes I've basically been doing nothing , but I guess it doesn't bother me. http://usuarios.lycos.es/careygg/recipe617.html wine for, http://marquislm.kilu.de/reciped51.html recipe fraction, http://golonkaeg.servik.com/recipe601.html recipe, Anyway, All the Best.

BashFAQ/022 (last edited 2021-09-01 06:31:58 by geirha)