Reputation: 193
This is my first bash script and have ran into a little problem with setting the decimal precision. I have been tasked to create a bash script that calculates the area and circumference of a circle given the diameter of 20. This is what I currently have
#!/bin/bash
clear
diameter=$1 # storing first argument
radius=$(echo "scale=5;$diameter / 2" | bc) # setting radius
# echo "$radius"
# calculate area of a circle
area=$(echo "scale=5;3.14 * ($radius * $radius)" | bc -l) # A = pi(r^2)
# calculate circumference of a circle
circum=$(echo "scale=5;2 * 3.14 * ($radius)" | bc -l) # C = 2(pi)(r)
echo "Circumference: $circum"
echo "Area: $area"
When I run the script it prints out
Circumference: 62.80000
Area: 314.00000
It should be printing out
Circumference: 62.83185
Area: 314.15926
I am not understand why it is not displaying the correct decimal values. I have given the scale=5
to display five decimal places which it is doing. I am confused why the zeros are showing up and not the true decimal values. Any help or suggestions would be greatly appreciated.
Upvotes: 1
Views: 171
Reputation: 113864
If pi were equal to 3.14, then your code is giving exact results.
To get the exact value of pi in bc
code, use 4*a(1)
:
# calculate area of a circle
area=$(echo "scale=5;4*a(1) * ($radius * $radius)" | bc -l) # A = pi(r^2)
# calculate circumference of a circle
circum=$(echo "scale=5;2 * 4*a(1) * ($radius)" | bc -l) # C = 2(pi)(r)
(This works because a(1)
is the arctangent of 1 which is pi/4.)
With those changes, a sample run looks like:
$ bash circ.sh 20
Circumference: 62.83120
Area: 314.15600
The limited precision now is due to the choice of scale=5
.
The code below keeps the best precision around until it is time to print and then prints in your desired precision:
#!/bin/bash
diameter=$1 # storing first argument
radius=$(echo "$diameter/2" | bc -l) # setting radius
# calculate area of a circle
area=$(echo "4*a(1)*$radius^2" | bc -l) # A = pi(r^2)
# calculate circumference of a circle
circum=$(echo "2 * 4*a(1) * $radius" | bc -l) # C = 2(pi)(r)
printf "Circumference: %.5f\n" "$circum"
printf "Area: %.5f\n" "$area"
Example:
$ bash circ.sh 20
Circumference: 62.83185
Area: 314.15927
Upvotes: 3