Go > Core Go Basics > Fundamental Data Types > Floating-point numbers (float32, float64)
Understanding Floating-Point Numbers in Go
This code demonstrates how to declare and use floating-point numbers (float32
and float64
) in Go. It covers basic arithmetic operations, formatting options, and considerations for precision.
Declaring and Initializing Floating-Point Variables
This section illustrates how to declare and initialize floating-point variables in Go. float32
is a 32-bit floating-point type, while float64
is a 64-bit floating-point type, offering higher precision. The short variable declaration operator :=
automatically infers the type as float64
for floating-point literals.
package main
import (
"fmt"
"math"
)
func main() {
// Declare a float32 variable
var float32Var float32 = 3.14
// Declare a float64 variable
var float64Var float64 = 3.14159265359
// Infer the type using := operator
floatVar := 2.71828 // Defaults to float64
fmt.Println("float32 variable:", float32Var)
fmt.Println("float64 variable:", float64Var)
fmt.Println("Inferred float64 variable:", floatVar)
}
Basic Arithmetic Operations
This code demonstrates fundamental arithmetic operations (+, -, *, /) with floating-point numbers. Go allows direct mathematical operations between float32
and float64
values after explicit type conversion (not shown here, but necessary when assigning the result to a variable of a specific type).
package main
import "fmt"
func main() {
a := 10.5
b := 3.2
// Addition
sum := a + b
// Subtraction
difference := a - b
// Multiplication
product := a * b
// Division
quotient := a / b
fmt.Println("Sum:", sum)
fmt.Println("Difference:", difference)
fmt.Println("Product:", product)
fmt.Println("Quotient:", quotient)
}
Floating-Point Formatting
This section showcases how to format floating-point numbers using fmt.Printf
. The %f
verb provides default formatting. The %.nf
verb specifies the number of decimal places (precision). %e
represents the number in scientific notation. %g
chooses the shorter of %f
and %e
.
package main
import "fmt"
func main() {
f := 123.456789
// Default formatting
fmt.Printf("Default: %f\n", f)
// Specify precision
fmt.Printf("Precision .2f: %.2f\n", f)
// Scientific notation
fmt.Printf("Scientific: %e\n", f)
// General format (chooses shortest representation)
fmt.Printf("General: %g\n", f)
}
Concepts Behind Floating-Point Numbers
Floating-point numbers represent real numbers in a computer system using a finite number of bits. They consist of three components: a sign, an exponent, and a mantissa (or significand). Due to their representation, floating-point numbers cannot always represent real numbers exactly, leading to potential rounding errors. The IEEE 754 standard defines the format for floating-point numbers, which Go uses.
Real-Life Use Case
Floating-point numbers are essential in scientific computing, financial applications, graphics rendering, and any domain involving real-world measurements. For example, calculating interest rates in banking, simulating physical phenomena in engineering, and determining pixel positions in computer graphics all rely heavily on floating-point arithmetic.
Best Practices
a == b
), check if their difference is within a small tolerance (e.g., math.Abs(a-b) < tolerance
).float64
by default: For most applications, float64
provides sufficient precision. Use float32
only if memory usage is a critical concern.
Interview Tip
A common interview question involves explaining the difference between float32
and float64
, as well as the potential issues with floating-point precision. Be prepared to discuss the IEEE 754 standard and how it affects calculations.
When to Use Them
Use float32
or float64
when you need to represent numbers with fractional parts or numbers outside the range of integers. float64
is generally preferred unless you have a strong reason to use float32
(e.g., memory constraints in embedded systems).
Memory Footprint
float32
occupies 4 bytes (32 bits) of memory, while float64
occupies 8 bytes (64 bits). This difference can be significant when dealing with large arrays or data structures.
Alternatives
Alternatives to floating-point numbers include:
Pros
Cons
FAQ
-
What is the difference between
float32
andfloat64
?
float32
is a 32-bit floating-point number, whilefloat64
is a 64-bit floating-point number.float64
offers higher precision and a wider range of representable values. -
Why should I avoid comparing floating-point numbers directly?
Due to the way floating-point numbers are represented in computers, direct equality comparisons (a == b
) can be unreliable. Rounding errors can cause two numbers that should be equal to differ slightly. Instead, compare their difference against a small tolerance. -
How can I format floating-point numbers for output?
You can usefmt.Printf
with formatting verbs like%f
(default),%.nf
(precision),%e
(scientific notation), and%g
(general format) to control the appearance of floating-point numbers in your output.