'===========================================================
' Title: Safe Floating-Point Comparison in VB.NET
'
' Purpose:
' Demonstrates how to compare floating-point values safely
' using an epsilon (tolerance) instead of direct equality.
'
' Why?
' Floating-point values are stored approximately in binary,
' which can introduce tiny rounding errors.
'
' Example:
' 0.1 + 0.2 <> 0.3
'
' Even though they are mathematically equal,
' they may not be exactly equal in memory.
'===========================================================
Imports System
Module Program
'-------------------------------------------------------
' Function: ApproximatelyEqual
'
' Compares two Double values using a tolerance (epsilon).
'
' Parameters:
' a - First value
' b - Second value
' epsilon - Maximum allowed difference
'
' Returns:
' True if the values are close enough
' False otherwise
'-------------------------------------------------------
Function ApproximatelyEqual(a As Double,
b As Double,
epsilon As Double) As Boolean
Return Math.Abs(a - b) <= epsilon
End Function
Sub Main()
' Example values
Dim x As Double = 0.1 + 0.2
Dim y As Double = 0.3
' Tolerance value
Dim epsilon As Double = 0.000000001
Console.WriteLine("======================================")
Console.WriteLine(" Safe Floating-Point Comparison Demo")
Console.WriteLine("======================================")
Console.WriteLine()
' Show full precision
Console.WriteLine("x = {0:F17}", x)
Console.WriteLine("y = {0:F17}", y)
Console.WriteLine()
' Direct comparison (not recommended)
If x = y Then
Console.WriteLine("Direct comparison (=): Equal")
Else
Console.WriteLine("Direct comparison (=): Not Equal")
End If
Console.WriteLine()
' Safe comparison using epsilon
If ApproximatelyEqual(x, y, epsilon) Then
Console.WriteLine("ApproximatelyEqual(): Equal")
Else
Console.WriteLine("ApproximatelyEqual(): Not Equal")
End If
End Sub
End Module
' run:
'
' ======================================
' Safe Floating-Point Comparison Demo
' ======================================
'
' x = 0.30000000000000004
' y = 0.29999999999999999
'
' Direct comparison (=): Not Equal
'
' ApproximatelyEqual(): Equal
'
'