From f68eb7c9fd968bea0811bdda521e29092bbbcc01 Mon Sep 17 00:00:00 2001 From: Evgueni Souleimanov Date: Tue, 17 Jun 2014 20:25:55 -0400 Subject: [PATCH] fix "warning: comparing floating point with == or != is unsafe" (epsilon comparison) Instead of comparing floats "x == y", perform comparison "fabs(x - y) <= epsilon", where epsilon is acceptable error that accumulates in computation of x and/or y. Because in this case all integers are small and all floats are exactly representable under IEEE754, epsilon may be zero in our tests. This warning occurred when compiling using gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3) on CentOS 6.5 x86_64 using the following CFLAGS (locally inserted into Makefile) CFLAGS = -g -Wall -Wextra -Wformat=2 -funsigned-char -fstrict-aliasing -Wstrict-aliasing -Wfloat-equal -Wundef -Wuninitialized -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Waddress -Waggregate-return -Wstrict-prototypes -Wold-style-declaration -Wold-style-definition -Wmissing-parameter-type -Wmissing-prototypes -Wmissing-declarations -Wmissing-field-initializers -Wmissing-noreturn -Wmissing-format-attribute -Wpacked -Wredundant-decls -Wnested-externs -Wshadow -Wsign-compare -Wlogical-op -std=c99 and this make command: make clean ; make example tests --- tests.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests.c b/tests.c index 3365edf..46c3dda 100644 --- a/tests.c +++ b/tests.c @@ -688,18 +688,18 @@ END_TEST START_TEST(test_minmea_float) { ck_assert(isnan(minmea_tofloat(&(struct minmea_float) { 42, 0 }))); - ck_assert(minmea_tofloat(&(struct minmea_float) { 7, 1}) == 7.0); - ck_assert(minmea_tofloat(&(struct minmea_float) { -200, 100}) == -2.0); - ck_assert(minmea_tofloat(&(struct minmea_float) { 15, 10}) == 1.5); + ck_assert(fabs(minmea_tofloat(&(struct minmea_float) { 7, 1}) - 7.0) <= 0.0f); + ck_assert(fabs(minmea_tofloat(&(struct minmea_float) { -200, 100}) - (-2.0)) <= 0.0f); + ck_assert(fabs(minmea_tofloat(&(struct minmea_float) { 15, 10}) - 1.5) <= 0.0f); } END_TEST START_TEST(test_minmea_coord) { ck_assert(isnan(minmea_tocoord(&(struct minmea_float) { 42, 0 }))); - ck_assert(minmea_tocoord(&(struct minmea_float) { 4200, 1 }) == 42.0); - ck_assert(minmea_tocoord(&(struct minmea_float) { 420000, 100 }) == 42.0); - ck_assert(minmea_tocoord(&(struct minmea_float) { 423000, 100 }) == 42.5); + ck_assert(fabs(minmea_tocoord(&(struct minmea_float) { 4200, 1 }) - 42.0) <= 0.0f); + ck_assert(fabs(minmea_tocoord(&(struct minmea_float) { 420000, 100 }) - 42.0) <= 0.0f); + ck_assert(fabs(minmea_tocoord(&(struct minmea_float) { 423000, 100 }) - 42.5) <= 0.0f); } END_TEST