/* Problem 10.* Comparing Floats
Write a program that safely compares floating-point numbers (double) with precision eps = 0.000001. Note that
we cannot directly compare two floating-point numbers a and b by a==b because of the nature of the floating-point
arithmetic. Therefore, we assume two numbers are equal if they are more closely to each other than a fixed
constant eps. Examples:
Number a Number b Equal (with precision eps=0.000001) Explanation
5.3 6.01 false The difference of 0.71 is too big (> eps)
5.00000001 5.00000003 true The difference 0.00000002 < eps
5.00000005 5.00000001 true The difference 0.00000004 < eps
-0.0000007 0.00000007 true The difference 0.00000077 < eps
-4.999999 -4.999998 false Border case. The difference 0.000001 == eps.
We consider the numbers are different.
4.999999 4.999998 false Border case. The difference 0.000001 == eps.
We consider the numbers are different.
*/
#include <stdio.h>
int compareFloats( float a, float b) {
float eps = 0.000001 ;
float diff;
if ( a > b)
diff = a - b;
else
diff = b - a;
printf ( "Floats %f and %f are " , a
, b
) ; if ( diff >= eps)
printf ( " equal (with precision eps=0.000001) " ) ; }
int main( void ) {
compareFloats( 5.3 , 6.01 ) ;
compareFloats( 5.00000001 , 5.00000003 ) ;
compareFloats( 5.00000005 , 5.00000001 ) ;
compareFloats( - 0.0000007 , 0.00000007 ) ;
compareFloats( - 4.999999 ,- 4.999998 ) ;
compareFloats( 4.999999 , 4.999998 ) ;
return 0 ;
}
ICAgICAgICAvKiBQcm9ibGVtIDEwLiogQ29tcGFyaW5nIEZsb2F0cwpXcml0ZSBhIHByb2dyYW0gdGhhdCBzYWZlbHkgY29tcGFyZXMgZmxvYXRpbmctcG9pbnQgbnVtYmVycyAoZG91YmxlKSB3aXRoIHByZWNpc2lvbiBlcHMgPSAwLjAwMDAwMS4gTm90ZSB0aGF0CndlIGNhbm5vdCBkaXJlY3RseSBjb21wYXJlIHR3byBmbG9hdGluZy1wb2ludCBudW1iZXJzIGEgYW5kIGIgYnkgYT09YiBiZWNhdXNlIG9mIHRoZSBuYXR1cmUgb2YgdGhlIGZsb2F0aW5nLXBvaW50CmFyaXRobWV0aWMuIFRoZXJlZm9yZSwgd2UgYXNzdW1lIHR3byBudW1iZXJzIGFyZSBlcXVhbCBpZiB0aGV5IGFyZSBtb3JlIGNsb3NlbHkgdG8gZWFjaCBvdGhlciB0aGFuIGEgZml4ZWQKY29uc3RhbnQgZXBzLiBFeGFtcGxlczoKCk51bWJlciBhIE51bWJlciBiIEVxdWFsICh3aXRoIHByZWNpc2lvbiBlcHM9MC4wMDAwMDEpIEV4cGxhbmF0aW9uCjUuMyA2LjAxIGZhbHNlIFRoZSBkaWZmZXJlbmNlIG9mIDAuNzEgaXMgdG9vIGJpZyAoPiBlcHMpCjUuMDAwMDAwMDEgNS4wMDAwMDAwMyB0cnVlIFRoZSBkaWZmZXJlbmNlIDAuMDAwMDAwMDIgPCBlcHMKNS4wMDAwMDAwNSA1LjAwMDAwMDAxIHRydWUgVGhlIGRpZmZlcmVuY2UgMC4wMDAwMDAwNCA8IGVwcwotMC4wMDAwMDA3IDAuMDAwMDAwMDcgdHJ1ZSBUaGUgZGlmZmVyZW5jZSAwLjAwMDAwMDc3IDwgZXBzCi00Ljk5OTk5OSAtNC45OTk5OTggZmFsc2UgQm9yZGVyIGNhc2UuIFRoZSBkaWZmZXJlbmNlIDAuMDAwMDAxID09IGVwcy4KV2UgY29uc2lkZXIgdGhlIG51bWJlcnMgYXJlIGRpZmZlcmVudC4KNC45OTk5OTkgNC45OTk5OTggZmFsc2UgQm9yZGVyIGNhc2UuIFRoZSBkaWZmZXJlbmNlIDAuMDAwMDAxID09IGVwcy4KV2UgY29uc2lkZXIgdGhlIG51bWJlcnMgYXJlIGRpZmZlcmVudC4KICAgICAgICAqLyAgICAKCiAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGlvLmg+CgoJCQlpbnQgY29tcGFyZUZsb2F0cyhmbG9hdCBhLCBmbG9hdCBiKSB7CgkJCQkKCQkJCWZsb2F0IGVwcyA9IDAuMDAwMDAxOwoJCQkJZmxvYXQgZGlmZjsKCgkJCQlpZiAoYSA+IGIpCgkJCQkJZGlmZiA9IGEgLSBiOwoJCQkJZWxzZQoJCQkJCWRpZmYgPSBiIC0gYTsKCgkJCQlwcmludGYoIkZsb2F0cyAlZiBhbmQgJWYgYXJlICIsIGEsIGIpOwoJCQkJaWYgKGRpZmYgPj0gZXBzKQoJCQkJCXByaW50Zigibm90Iik7CgkJCQlwcmludGYoIiBlcXVhbCAod2l0aCBwcmVjaXNpb24gZXBzPTAuMDAwMDAxKSAiKTsKCQkJCX0KCiAgICAgICAgICAgIGludCBtYWluKHZvaWQpIHsKICAgICAKICAgIAkJCWNvbXBhcmVGbG9hdHMoNS4zLDYuMDEpOwogICAgCQkJY29tcGFyZUZsb2F0cyg1LjAwMDAwMDAxLDUuMDAwMDAwMDMpOwogICAgCQkJY29tcGFyZUZsb2F0cyg1LjAwMDAwMDA1LDUuMDAwMDAwMDEpOwogICAgCQkJY29tcGFyZUZsb2F0cygtMC4wMDAwMDA3LDAuMDAwMDAwMDcpOwogICAgCQkJY29tcGFyZUZsb2F0cygtNC45OTk5OTksLTQuOTk5OTk4KTsKICAgIAkJCWNvbXBhcmVGbG9hdHMoNC45OTk5OTksNC45OTk5OTgpOwogICAgIAogICAgICAgIAkJcmV0dXJuIDA7CiAgICAgICAgICAgIH0=