TurtleMan
TurtleMan

Reputation: 193

Decimal values in bash script becoming all zeros

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

Answers (1)

John1024
John1024

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.

Still better precision

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

Related Questions