librfn
An ad-hoc utility library
fuzz.c
Go to the documentation of this file.
1 /*
2  * fuzz.c
3  *
4  * Part of librfn (a general utility library from redfelineninja.org.uk)
5  *
6  * Copyright (C) 2012 Daniel Thompson <daniel@redfelineninja.org.uk>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as published
10  * by the Free Software Foundation; either version 3 of the License, or
11  * (at your option) any later version.
12  */
13 
14 #include <assert.h>
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <math.h>
18 
19 #include "librfn.h"
20 
21 int fuzzcmp(double a, double b, double delta)
22 {
23  double aa, ab;
24 
25  assert(delta >= 1.0);
26 
27  aa = fabs(a);
28  ab = fabs(b);
29 
30  /* check for matching sign */
31  if ((aa == a) != (ab == b))
32  return 0;
33 
34  if (aa <= ab) {
35  return (aa * delta) >= ab;
36  } else {
37  return (ab * delta) >= aa;
38  }
39 }
40 
41 int fuzzcmpf(float a, float b, float delta)
42 {
43  float aa, ab;
44 
45  assert(delta >= 1.0f);
46 
47  aa = fabsf(a);
48  ab = fabsf(b);
49 
50  /* check for matching sign */
51  if ((aa == a) != (ab == b))
52  return 0;
53 
54  if (aa <= ab) {
55  return (aa * delta) >= ab;
56  } else {
57  return (ab * delta) >= aa;
58  }
59 }
60 
61 int fuzzcmpe(double a, double b, double e)
62 {
63  return ((a <= b) && ((a+e)) >= b) ||
64  ((b <= a) && ((b+e)) >= a);
65 }
66 
67 int fuzzcmpef(float a, float b, float e)
68 {
69  return ((a <= b) && ((a+e)) >= b) ||
70  ((b <= a) && ((b+e)) >= a);
71 }
72 
73 int fuzzcmpb(double a, double b, int bits)
74 {
75  double delta = 1.0 + (1.0 / (double) (1 << bits));
76  return fuzzcmp(a, b, delta);
77 }
78 
79 int fuzzcmpbf(float a, float b, int bits)
80 {
81  float delta = 1.0f + (1.0f / (float) (1 << bits));
82  return fuzzcmpf(a, b, delta);
83 }
struct alpha a
int fuzzcmp(double a, double b, double delta)
Definition: fuzz.c:21
struct bravo b
int fuzzcmpf(float a, float b, float delta)
Definition: fuzz.c:41
int fuzzcmpbf(float a, float b, int bits)
Definition: fuzz.c:79
int fuzzcmpe(double a, double b, double e)
Definition: fuzz.c:61
int fuzzcmpb(double a, double b, int bits)
Definition: fuzz.c:73
int fuzzcmpef(float a, float b, float e)
Definition: fuzz.c:67