1 /*
2  * librdkafka - Apache Kafka C library
3  *
4  * Copyright (c) 2012-2018, Magnus Edenhill
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright notice,
11  *    this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright notice,
13  *    this list of conditions and the following disclaimer in the documentation
14  *    and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #pragma once
30 
31 #include <math.h>
32 
33 /**
34  * rd_dbl_eq0(a,b,prec)
35  * Check two doubles for equality with the specified precision.
36  * Use this instead of != and == for all floats/doubles.
37  * More info:
38  *  http://docs.sun.com/source/806-3568/ncg_goldberg.html
39  */
40 static RD_INLINE RD_UNUSED
rd_dbl_eq0(double a,double b,double prec)41 int rd_dbl_eq0 (double a, double b, double prec) {
42   return fabs(a - b) < prec;
43 }
44 
45 /* A default 'good' double-equality precision value.
46  * This rather timid epsilon value is useful for tenths, hundreths,
47  * and thousands parts, but not anything more precis than that.
48  * If a higher precision is needed, use dbl_eq0 and dbl_eq0 directly
49  * and specify your own precision. */
50 #define RD_DBL_EPSILON 0.00001
51 
52 /**
53  * rd_dbl_eq(a,b)
54  * Same as rd_dbl_eq0() above but with a predefined 'good' precision.
55  */
56 #define rd_dbl_eq(a,b) rd_dbl_eq0(a,b,RD_DBL_EPSILON)
57 
58 /**
59  * rd_dbl_ne(a,b)
60  * Same as rd_dbl_eq() above but with reversed logic: not-equal.
61  */
62 #define rd_dbl_ne(a,b) (!rd_dbl_eq0(a,b,RD_DBL_EPSILON))
63 
64 /**
65  * rd_dbl_zero(a)
66  * Checks if the double `a' is zero (or close enough).
67  */
68 #define rd_dbl_zero(a)  rd_dbl_eq0(a,0.0,RD_DBL_EPSILON)
69