Comparison of a float with a value in C
Last Updated :
05 Feb, 2023
Predict the output of the following C program.
C
#include<stdio.h>
int main()
{
float x = 0.1;
if (x == 0.1)
printf("IF");
else if (x == 0.1f)
printf("ELSE IF");
else
printf("ELSE");
}
The output of above program is "ELSE IF" which means the expression "x == 0.1" returns false and expression "x == 0.1f" returns true.
Let consider the following program to understand the reason behind the above output.
C
#include<stdio.h>
int main()
{
float x = 0.1;
printf("%d %d %d", sizeof(x), sizeof(0.1), sizeof(0.1f));
return 0;
}
The output of above program is "4 8 4" on a typical C compiler.
It actually prints size of float, size of double and size of float.
The values used in an expression are considered as double (double precision floating point format) unless a 'f' is specified at the end. So the expression "x==0.1" has a double on right side and float which are stored in a single precision floating point format on left side. In such situations, float is promoted to double (see this). The double precision format uses more bits for precision than single precision format.
The binary equivalent of 0.110 can be written as (0.00011001100110011...)2 which goes up to infinity(See this article to know more about conversion). Since the precision of float is less than the double therefore after a certain point(23 in float and 52 in double) it would truncate the result. Hence, after promotion of float into double(at the time of comparison) compiler will pad the remaining bits with zeroes. Hence, we get the different result in which decimal equivalent of both would be different. For instance,
In float
=> (0.1)10 = (0.00011001100110011001100)2
In double after promotion of float ...(1)
=> (0.1)10 = (0.00011001100110011001100000000000000000...)2
^ padding zeroes here
In double without promotion ... (2)
=> (0.1)10 = (0.0001100110011001100110011001100110011001100110011001)2
Hence we can see the result of both equations are different.
Therefore 'if' statement can never be executed.
Note that the promotion of float to double can only cause mismatch when a value (like 0.1) uses more precision bits than the bits of single precision. For example, the following C program prints "IF".
Example no 1
C
#include<stdio.h>
int main()
{
float x = 0.5;
if (x == 0.5)
printf("IF");
else if (x == 0.5f)
printf("ELSE IF");
else
printf("ELSE");
}
Output:
IF
Here binary equivalent of 0.510 is (0.100000...)2
(No precision will be lost in both float and double type). Therefore if compiler pad the extra zeroes at the time of promotion then we would get the same result in the decimal equivalent of both left and right side in comparison(x == 0.5).
You can refer Floating Point Representation – Basics for the representation of floating-point numbers.
Example no 2
Here is a program in C that compares a floating-point number with a given value:
C
#include <stdio.h>
#include <math.h>
int main() {
float num;
float comparison_value = 3.14;
printf("Enter a floating-point number: ");
scanf("%f", &num);
if (fabs(num - comparison_value) < 0.0001) {
printf("The numbers are equal\n");
} else {
printf("The numbers are not equal\n");
}
return 0;
}
- In this program, the user is prompted to enter a floating-point number. The program then uses the fabs function from the math.h library to compare the difference between the entered number and the comparison value (comparison_value). The fabs function returns the absolute value of its argument.
- The comparison is performed by checking if the absolute difference between the two numbers is less than a small tolerance value (0.0001 in this case). If the difference is less than the tolerance, the program outputs "The numbers are equal". Otherwise, the program outputs "The numbers are not equal".
Similar Reads
C Programming Language Tutorial C is a general-purpose mid-level programming language developed by Dennis M. Ritchie at Bell Laboratories in 1972. It was initially used for the development of UNIX operating system, but it later became popular for a wide range of applications. Today, C remains one of the top three most widely used
5 min read
C Language Introduction C is a general-purpose procedural programming language initially developed by Dennis Ritchie in 1972 at Bell Laboratories of AT&T Labs. It was mainly created as a system programming language to write the UNIX operating system.Main features of CWhy Learn C?C is considered mother of all programmin
6 min read
Dynamic Memory Allocation in C using malloc(), calloc(), free() and realloc() In C, a variable defined in a function is stored in the stack memory. The requirement of this memory is that it needs to know the size of the data to memory at compile time (before the program runs). Also, once defined, we can neither change the size nor completely delete the memory.To resolve this,
9 min read
Data Types in C Each variable in C has an associated data type. It specifies the type of data that the variable can store like integer, character, floating, double, etc.Example:C++int number;The above statement declares a variable with name number that can store integer values.C is a statically type language where
5 min read
C Arrays An array in C is a fixed-size collection of similar data items stored in contiguous memory locations. It can be used to store the collection of primitive data types such as int, char, float, etc., as well as derived and user-defined data types such as pointers, structures, etc. Creating an Array in
7 min read
C Pointers A pointer is a variable that stores the memory address of another variable. Instead of holding a direct value, it holds the address where the value is stored in memory. It is the backbone of low-level memory manipulation in C. Accessing the pointer directly will just give us the address that is stor
9 min read
C Programs To learn anything effectively, practicing and solving problems is essential. To help you master C programming, we have compiled over 100 C programming examples across various categories, including basic C programs, Fibonacci series, strings, arrays, base conversions, pattern printing, pointers, and
8 min read
Operators in C In C language, operators are symbols that represent some kind of operations to be performed. They are the basic components of the C programming. In this article, we will learn about all the operators in C with examples.What is an Operator in C?A C operator can be defined as the symbol that helps us
11 min read
Bitwise Operators in C In C, bitwise operators are used to perform operations directly on the binary representations of numbers. These operators work by manipulating individual bits (0s and 1s) in a number.The following 6 operators are bitwise operators (also known as bit operators as they work at the bit-level). They are
6 min read
Basics of File Handling in C File handling in C is the process in which we create, open, read, write, and close operations on a file. C language provides different functions such as fopen(), fwrite(), fread(), fseek(), fprintf(), etc. to perform input, output, and many different C file operations in our program.Need of File Han
13 min read