mirror of
https://github.com/DaveGamble/cJSON.git
synced 2024-12-27 14:14:07 +08:00
comparing double value with DBL_EPSILON
This commit is contained in:
parent
3ece4c893c
commit
8943c73345
2
Makefile
2
Makefile
@ -37,7 +37,7 @@ else
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
PIC_FLAGS = -fPIC
|
PIC_FLAGS = -fPIC
|
||||||
R_CFLAGS = $(PIC_FLAGS) -pedantic -Wall -Werror -Wstrict-prototypes -Wwrite-strings -Wshadow -Winit-self -Wcast-align -Wformat=2 -Wmissing-prototypes -Wstrict-overflow=2 -Wcast-qual -Wc++-compat -Wundef -Wswitch-default -Wconversion -Wfloat-equal $(CFLAGS)
|
R_CFLAGS = $(PIC_FLAGS) -pedantic -Wall -Werror -Wstrict-prototypes -Wwrite-strings -Wshadow -Winit-self -Wcast-align -Wformat=2 -Wmissing-prototypes -Wstrict-overflow=2 -Wcast-qual -Wc++-compat -Wundef -Wswitch-default -Wconversion $(CFLAGS)
|
||||||
|
|
||||||
uname := $(shell sh -c 'uname -s 2>/dev/null || echo false')
|
uname := $(shell sh -c 'uname -s 2>/dev/null || echo false')
|
||||||
|
|
||||||
|
14
cJSON.c
14
cJSON.c
@ -43,6 +43,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
#ifdef ENABLE_LOCALES
|
#ifdef ENABLE_LOCALES
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
@ -68,6 +69,14 @@
|
|||||||
#endif
|
#endif
|
||||||
#define false ((cJSON_bool)0)
|
#define false ((cJSON_bool)0)
|
||||||
|
|
||||||
|
/* define isnan and isinf for ANSI C, if in C99 or above, isnan and isinf has been defined in math.h */
|
||||||
|
#ifndef isinf
|
||||||
|
#define isinf(d) (isnan((d - d)) && !isnan(d))
|
||||||
|
#endif
|
||||||
|
#ifndef isnan
|
||||||
|
#define isnan(d) (d != d)
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const unsigned char *json;
|
const unsigned char *json;
|
||||||
size_t position;
|
size_t position;
|
||||||
@ -483,7 +492,8 @@ static void update_offset(printbuffer * const buffer)
|
|||||||
/* securely comparison of floating-point variables */
|
/* securely comparison of floating-point variables */
|
||||||
static cJSON_bool compare_double(double a, double b)
|
static cJSON_bool compare_double(double a, double b)
|
||||||
{
|
{
|
||||||
return (fabs(a - b) <= CJSON_DOUBLE_PRECISION);
|
double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b);
|
||||||
|
return (fabs(a - b) <= maxVal * DBL_EPSILON);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Render the number nicely from the given item into a string. */
|
/* Render the number nicely from the given item into a string. */
|
||||||
@ -503,7 +513,7 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* This checks for NaN and Infinity */
|
/* This checks for NaN and Infinity */
|
||||||
if ((d * 0) != 0)
|
if (isnan(d) || isinf(d))
|
||||||
{
|
{
|
||||||
length = sprintf((char*)number_buffer, "null");
|
length = sprintf((char*)number_buffer, "null");
|
||||||
}
|
}
|
||||||
|
5
cJSON.h
5
cJSON.h
@ -137,11 +137,6 @@ typedef int cJSON_bool;
|
|||||||
#define CJSON_NESTING_LIMIT 1000
|
#define CJSON_NESTING_LIMIT 1000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Precision of double variables comparison */
|
|
||||||
#ifndef CJSON_DOUBLE_PRECISION
|
|
||||||
#define CJSON_DOUBLE_PRECISION .0000000000000001
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* returns the version of cJSON as a string */
|
/* returns the version of cJSON as a string */
|
||||||
CJSON_PUBLIC(const char*) cJSON_Version(void);
|
CJSON_PUBLIC(const char*) cJSON_Version(void);
|
||||||
|
|
||||||
|
@ -40,6 +40,8 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <float.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#pragma warning (pop)
|
#pragma warning (pop)
|
||||||
@ -109,7 +111,8 @@ static int compare_strings(const unsigned char *string1, const unsigned char *st
|
|||||||
/* securely comparison of floating-point variables */
|
/* securely comparison of floating-point variables */
|
||||||
static cJSON_bool compare_double(double a, double b)
|
static cJSON_bool compare_double(double a, double b)
|
||||||
{
|
{
|
||||||
return (fabs(a - b) <= CJSON_DOUBLE_PRECISION);
|
double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b);
|
||||||
|
return (fabs(a - b) <= maxVal * DBL_EPSILON);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user