Differences between revisions 27 and 28
Revision 27 as of 2008-11-30 15:43:27
Size: 2210
Editor: GreyCat
Comment: spam
Revision 28 as of 2008-12-02 03:02:16
Size: 689
Editor: user-0cdvdql
Comment: 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.
Perfect site! I trust that you will be happy to share your story with any similarly unfortunate individuals as, although I can't any were near comprehend what you've all been through both physically, mentally emotionally or whatever, the one thing I am sure is that many people may take great comfort from realising (if you didn't at the time) that life doesn't end when the horrible event happens, but that after time, care, support and understanding, but above all self-determination, that a new and very much altered but still very enjoyable life begins beer I will visit your website again. http://beefrecipes.wikidot.com/system:page-tags/tag/cocktail pasta, Thank you for good job!

Perfect site! I trust that you will be happy to share your story with any similarly unfortunate individuals as, although I can't any were near comprehend what you've all been through both physically, mentally emotionally or whatever, the one thing I am sure is that many people may take great comfort from realising (if you didn't at the time) that life doesn't end when the horrible event happens, but that after time, care, support and understanding, but above all self-determination, that a new and very much altered but still very enjoyable life begins beer I will visit your website again. http://beefrecipes.wikidot.com/system:page-tags/tag/cocktail pasta, Thank you for good job!

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