Differences between revisions 11 and 39 (spanning 28 versions)
Revision 11 as of 2008-11-24 12:33:16
Size: 507
Editor: 91
Comment: This is a cool site! Just a little anecdote I'd like to share with you, and another example of courage in the face of adversity chilli crab recipe So it goes. http://diamond79.kilu.de/recipef6d.html r
Revision 39 as of 2008-12-03 10:27:08
Size: 2210
Editor: pgas
Comment: spam
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
This is a cool site! Just a little anecdote I'd like to share with you, and another example of courage in the face of adversity chilli crab recipe So it goes. http://diamond79.kilu.de/recipef6d.html recipes for people with ulcers , http://costcos64.007sites.com/recipe5c5.html grain free dog cookie recipes will, http://diamond79.kilu.de/recipe0fe.html mexican inspired outdoor kitchens experiment, http://diamond79.kilu.de/recipeda3.html recipes for drummettes, I just don't have much to say these days. <<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.

How can I calculate with floating point numbers instead of just integers?

BASH does not have built-in floating point 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.

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