From abeaf45b1e718bf1fbce99a6775aaebae7ed81c1 Mon Sep 17 00:00:00 2001 From: Rashad Kanavath Date: Sat, 15 Feb 2020 18:34:00 +0100 Subject: [PATCH 1/2] MSVC: fix nan/inf issues on msvc and gcc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apply clang-format formatting Co-authored-by: Edouard Choinière <27212526+echoix@users.noreply.github.com> --- general/g.region/printwindow.c | 5 ++++- lib/btree2/kdtree.c | 2 +- lib/vector/Vlib/box.c | 12 +++++++++--- raster/r.in.bin/main.c | 3 ++- raster/r.in.lidar/info.c | 4 +++- raster/r.li/r.li.padrange/padrange.c | 12 ++++++------ raster/r.out.gdal/main.c | 6 ++++-- raster/r.series.accumulate/main.c | 4 ++-- raster/r.series/main.c | 4 ++-- raster/r.univar/r.univar_main.c | 6 ++++-- raster/r.univar/r3.univar_main.c | 8 ++++---- raster/r.univar/stats.c | 25 ++++++++++++++++--------- raster3d/r3.in.lidar/info.c | 4 +++- vector/v.cluster/main.c | 4 ++-- vector/v.distance/distance.c | 4 +++- vector/v.voronoi/skeleton.c | 2 +- 16 files changed, 66 insertions(+), 39 deletions(-) diff --git a/general/g.region/printwindow.c b/general/g.region/printwindow.c index c36600864ff..d675b83e570 100644 --- a/general/g.region/printwindow.c +++ b/general/g.region/printwindow.c @@ -598,7 +598,10 @@ void print_window(struct Cell_head *window, int print_flag, int flat_flag, double convergence; if (G_projection() == PROJECTION_XY) - convergence = NAN; + // GCC 5.4.0 says 0./0. is -nan + // Clang 3.8.0 says 0./0. is nan + // I stick to -nan in msvc too. But this has to rechecked. + sscanf("-nan", "%lf", &convergence); else if (G_projection() == PROJECTION_LL) convergence = 0.0; else { diff --git a/lib/btree2/kdtree.c b/lib/btree2/kdtree.c index ec0d19e0abc..4c3090a9664 100644 --- a/lib/btree2/kdtree.c +++ b/lib/btree2/kdtree.c @@ -531,7 +531,7 @@ int kdtree_knn(struct kdtree *t, double *c, int *uid, double *d, int k, if (skip) sn.uid = *skip; - maxdist = INFINITY; + sscanf("inf", "%lf", &maxdist); found = 0; /* go down */ diff --git a/lib/vector/Vlib/box.c b/lib/vector/Vlib/box.c index 5ab5ef74e2d..48028852abd 100644 --- a/lib/vector/Vlib/box.c +++ b/lib/vector/Vlib/box.c @@ -247,7 +247,9 @@ int Vect_get_line_box(struct Map_info *Map, int line, struct bound_box *Box) Line = Plus->Line[line]; if (Line == NULL) { /* dead */ - Box->N = Box->S = Box->E = Box->W = Box->T = Box->B = NAN; + double nan_val; + sscanf("-nan", "%lf", &nan_val); + Box->N = Box->S = Box->E = Box->W = Box->T = Box->B = nan_val; return 0; } @@ -311,7 +313,9 @@ int Vect_get_area_box(struct Map_info *Map, int area, struct bound_box *Box) Area = Plus->Area[area]; if (Area == NULL) { /* dead */ - Box->N = Box->S = Box->E = Box->W = Box->T = Box->B = NAN; + double nan_val; + sscanf("-nan", "%lf", &nan_val); + Box->N = Box->S = Box->E = Box->W = Box->T = Box->B = nan_val; return 0; } @@ -357,7 +361,9 @@ int Vect_get_isle_box(struct Map_info *Map, int isle, struct bound_box *Box) Isle = Plus->Isle[isle]; if (Isle == NULL) { /* dead */ - Box->N = Box->S = Box->E = Box->W = Box->T = Box->B = NAN; + double nan_val; + sscanf("-nan", "%lf", &nan_val); + Box->N = Box->S = Box->E = Box->W = Box->T = Box->B = nan_val; return 0; } diff --git a/raster/r.in.bin/main.c b/raster/r.in.bin/main.c index 08b657746e5..4d3574dc909 100644 --- a/raster/r.in.bin/main.c +++ b/raster/r.in.bin/main.c @@ -255,7 +255,8 @@ int main(int argc, char *argv[]) const char *outpre; char output[GNAME_MAX]; const char *title; - double null_val = NAN; + double null_val; + sscanf("-nan", "%lf", &null_val); int is_fp; int is_signed; int bytes, hbytes; diff --git a/raster/r.in.lidar/info.c b/raster/r.in.lidar/info.c index 0eb11819e3c..edab13c0829 100644 --- a/raster/r.in.lidar/info.c +++ b/raster/r.in.lidar/info.c @@ -97,7 +97,9 @@ int scan_bounds(LASReaderH LAS_reader, int shell_style, int extents, int update, first = TRUE; /* init to nan in case no points are found */ - min_x = max_x = min_y = max_y = min_z = max_z = NAN; + double nan_val; + sscanf("-nan", "%lf", &nan_val); + min_x = max_x = min_y = max_y = min_z = max_z = nan_val; G_verbose_message(_("Scanning data ...")); diff --git a/raster/r.li/r.li.padrange/padrange.c b/raster/r.li/r.li.padrange/padrange.c index 39e4e8e79e9..71ca505cb89 100644 --- a/raster/r.li/r.li.padrange/padrange.c +++ b/raster/r.li/r.li.padrange/padrange.c @@ -309,8 +309,8 @@ int calculate(int fd, struct area_entry *ad, double *result) (((NS_DIST1 + NS_DIST2) / 2) / hd.rows); /* get min and max patch size */ - min = INFINITY; - max = -INFINITY; + sscanf("inf", "%lf", &min); /* inf */ + sscanf("-inf", "%lf", &max); /* -inf */ for (old_pid = 1; old_pid <= pid; old_pid++) { if (pst[old_pid].count > 0) { area_p = cell_size_m * pst[old_pid].count / 10000; @@ -543,8 +543,8 @@ int calculateD(int fd, struct area_entry *ad, double *result) (((NS_DIST1 + NS_DIST2) / 2) / hd.rows); /* get min and max patch size */ - min = INFINITY; - max = -INFINITY; + sscanf("inf", "%lf", &min); /* inf */ + sscanf("-inf", "%lf", &max); /* -inf */ for (old_pid = 1; old_pid <= pid; old_pid++) { if (pst[old_pid].count > 0) { area_p = cell_size_m * pst[old_pid].count / 10000; @@ -777,8 +777,8 @@ int calculateF(int fd, struct area_entry *ad, double *result) (((NS_DIST1 + NS_DIST2) / 2) / hd.rows); /* get min and max patch size */ - min = INFINITY; - max = -INFINITY; + sscanf("inf", "%lf", &min); /* inf */ + sscanf("-inf", "%lf", &max); /* -inf */ for (old_pid = 1; old_pid <= pid; old_pid++) { if (pst[old_pid].count > 0) { area_p = cell_size_m * pst[old_pid].count / 10000; diff --git a/raster/r.out.gdal/main.c b/raster/r.out.gdal/main.c index 5021c26e9e1..ff01d79a2e3 100644 --- a/raster/r.out.gdal/main.c +++ b/raster/r.out.gdal/main.c @@ -1002,6 +1002,8 @@ int nodataval_check(double nodataval, GDALDataType datatype) double set_default_nodata_value(GDALDataType datatype, double min, double max) { + double nan_val; + sscanf("-nan", "%lf", &nan_val); switch (datatype) { case GDT_Byte: if (max < TYPE_BYTE_MAX) @@ -1047,11 +1049,11 @@ double set_default_nodata_value(GDALDataType datatype, double min, double max) case GDT_Float32: case GDT_CFloat32: - return NAN; + return nan_val; case GDT_Float64: case GDT_CFloat64: - return NAN; + return nan_val; default: return 0; diff --git a/raster/r.series.accumulate/main.c b/raster/r.series.accumulate/main.c index 2c526c30257..b17ec50725f 100644 --- a/raster/r.series.accumulate/main.c +++ b/raster/r.series.accumulate/main.c @@ -171,8 +171,8 @@ int main(int argc, char *argv[]) if (G_parser(argc, argv)) exit(EXIT_FAILURE); - lo = -INFINITY; - hi = INFINITY; + sscanf("-inf", "%lf", &lo); + sscanf("inf", "%lf", &hi); method = METHOD_GDD; if (G_strncasecmp(parm.method->answer, "gdd", 3) == 0) method = METHOD_GDD; diff --git a/raster/r.series/main.c b/raster/r.series/main.c index fae508d6088..b021b6a0fe9 100644 --- a/raster/r.series/main.c +++ b/raster/r.series/main.c @@ -231,8 +231,8 @@ int main(int argc, char *argv[]) G_warning(_("Parallel processing disabled due to active mask.")); nprocs = 1; } - lo = -INFINITY; - hi = INFINITY; + sscanf("-inf", "%lf", &lo); + sscanf("inf", "%lf", &hi); if (parm.range->answer) { lo = atof(parm.range->answers[0]); hi = atof(parm.range->answers[1]); diff --git a/raster/r.univar/r.univar_main.c b/raster/r.univar/r.univar_main.c index 7a3cbc0c7c4..960df33869e 100644 --- a/raster/r.univar/r.univar_main.c +++ b/raster/r.univar/r.univar_main.c @@ -206,9 +206,11 @@ int main(int argc, char *argv[]) #endif /* table field separator */ zone_info.sep = G_option_to_separator(param.separator); + double nan_val; + sscanf("-nan", "%lf", &nan_val); - zone_info.min = 0; - zone_info.max = 0; + zone_info.min = nan_val; /* set to nan as default */ + zone_info.max = nan_val; /* set to nan as default */ zone_info.n_zones = 0; /* setting up thread workspace */ diff --git a/raster/r.univar/r3.univar_main.c b/raster/r.univar/r3.univar_main.c index 28fdb69acd5..ba54e807ccc 100644 --- a/raster/r.univar/r3.univar_main.c +++ b/raster/r.univar/r3.univar_main.c @@ -144,10 +144,10 @@ int main(int argc, char *argv[]) /* table field separator */ zone_info.sep = G_option_to_separator(param.separator); - dmin = NAN; - dmax = NAN; - zone_info.min = 0; - zone_info.max = 0; + sscanf("-nan", "%lf", &dmin); /* set to nan as default */ + sscanf("-nan", "%lf", &dmax); /* set to nan as default */ + sscanf("-nan", "%lf", &zone_info.min); /* set to nan as default */ + sscanf("-nan", "%lf", &zone_info.max); /* set to nan as default */ zone_info.n_zones = 0; /* open 3D zoning raster with default region */ diff --git a/raster/r.univar/stats.c b/raster/r.univar/stats.c index 97367976103..b29099a06bb 100644 --- a/raster/r.univar/stats.c +++ b/raster/r.univar/stats.c @@ -22,6 +22,8 @@ univar_stat *create_univar_stat_struct(int map_type, int n_perc) univar_stat *stats; int i; int n_zones = zone_info.n_zones; + double nan_val; + sscanf("-nan", "%lf", &nan_val); if (n_zones == 0) n_zones = 1; @@ -31,8 +33,8 @@ univar_stat *create_univar_stat_struct(int map_type, int n_perc) for (i = 0; i < n_zones; i++) { stats[i].sum = 0.0; stats[i].sumsq = 0.0; - stats[i].min = NAN; - stats[i].max = NAN; + stats[i].min = nan_val; /* set to nan as default */ + stats[i].max = nan_val; /* set to nan as default */ stats[i].n_perc = n_perc; if (n_perc > 0) stats[i].perc = (double *)G_malloc(n_perc * sizeof(double)); @@ -97,6 +99,8 @@ int print_stats(univar_stat *stats, enum OutputFormat format) } int z, n_zones = zone_info.n_zones; + double nan_val; + sscanf("-nan", "%lf", &nan_val); if (n_zones == 0) n_zones = 1; @@ -125,8 +129,9 @@ int print_stats(univar_stat *stats, enum OutputFormat format) stdev = sqrt(variance); var_coef = (stdev / mean) * 100.; /* perhaps stdev/fabs(mean) ? */ - if (stats[z].n == 0) - stats[z].sum = stats[z].sum_abs = NAN; + if (stats[z].n == 0) { + stats[z].sum = stats[z].sum_abs = nan_val; + } sprintf(sum_str, "%.15g", stats[z].sum); G_trim_decimal(sum_str); @@ -220,9 +225,9 @@ int print_stats(univar_stat *stats, enum OutputFormat format) quartile_perc = (double *)G_calloc(stats[z].n_perc, sizeof(double)); if (stats[z].n == 0) { - quartile_25 = median = quartile_75 = NAN; + quartile_25 = median = quartile_75 = nan_val; for (i = 0; i < stats[z].n_perc; i++) - quartile_perc[i] = NAN; + quartile_perc[i] = nan_val; } else { for (i = 0; i < stats[z].n_perc; i++) { @@ -411,6 +416,8 @@ int print_stats_table(univar_stat *stats) { unsigned int i; int z, n_zones = zone_info.n_zones; + double nan_val; + sscanf("-nan", "%lf", &nan_val); if (n_zones == 0) n_zones = 1; @@ -485,7 +492,7 @@ int print_stats_table(univar_stat *stats) var_coef = (stdev / mean) * 100.; /* perhaps stdev/fabs(mean) ? */ if (stats[z].n == 0) - stats[z].sum = stats[z].sum_abs = NAN; + stats[z].sum = stats[z].sum_abs = nan_val; if (zone_info.n_zones) { int z_cat = z + zone_info.min; @@ -533,9 +540,9 @@ int print_stats_table(univar_stat *stats) quartile_perc = (double *)G_calloc(stats[z].n_perc, sizeof(double)); if (stats[z].n == 0) { - quartile_25 = median = quartile_75 = NAN; + quartile_25 = median = quartile_75 = nan_val; for (i = 0; i < stats[z].n_perc; i++) - quartile_perc[i] = NAN; + quartile_perc[i] = nan_val; } else { for (i = 0; i < stats[z].n_perc; i++) { diff --git a/raster3d/r3.in.lidar/info.c b/raster3d/r3.in.lidar/info.c index bf953f1d8b8..da4fd86fc4b 100644 --- a/raster3d/r3.in.lidar/info.c +++ b/raster3d/r3.in.lidar/info.c @@ -101,7 +101,9 @@ int scan_bounds(LASReaderH LAS_reader, int shell_style, int extents, int update, first = TRUE; /* init to nan in case no points are found */ - min_x = max_x = min_y = max_y = min_z = max_z = NAN; + double nan_val; + sscanf("-nan", "%lf", &nan_val); + min_x = max_x = min_y = max_y = min_z = max_z = nan_val; G_verbose_message(_("Scanning data ...")); diff --git a/vector/v.cluster/main.c b/vector/v.cluster/main.c index 49c7535beca..fece56d4e66 100644 --- a/vector/v.cluster/main.c +++ b/vector/v.cluster/main.c @@ -256,7 +256,7 @@ int main(int argc, char *argv[]) c[2] = 0.0; n = 0; sum = sumsq = 0; - min = INFINITY; + sscanf("inf", "%lf", &min); max = 0; kd = G_malloc(minpnts * sizeof(double)); ki = G_malloc(minpnts * sizeof(int)); @@ -462,7 +462,7 @@ int main(int argc, char *argv[]) c[2] = 0.0; n = 0; sum = sumsq = 0; - min = INFINITY; + sscanf("inf", "%lf", &min); max = 0; kd = G_malloc(minpnts * sizeof(double)); ki = G_malloc(minpnts * sizeof(int)); diff --git a/vector/v.distance/distance.c b/vector/v.distance/distance.c index 74c6d88a40d..569ee5812ea 100644 --- a/vector/v.distance/distance.c +++ b/vector/v.distance/distance.c @@ -11,7 +11,9 @@ int get_line_box(const struct line_pnts *Points, struct bound_box *box) int i; if (Points->n_points == 0) { - box->E = box->W = box->N = box->S = box->T = box->B = NAN; + double nan_val; + sscanf("-nan", "%lf", &nan_val); + box->E = box->W = box->N = box->S = box->T = box->B = nan_val; return 0; } diff --git a/vector/v.voronoi/skeleton.c b/vector/v.voronoi/skeleton.c index 9e052b76d0e..226e55d5071 100644 --- a/vector/v.voronoi/skeleton.c +++ b/vector/v.voronoi/skeleton.c @@ -533,7 +533,7 @@ int tie_up(void) IPoints[i]); } - distmin = INFINITY; + sscanf("inf", "%lf", &distmin); xmin = x; ymin = y; From 4c1f03341016395d62e38a1d959a00f29f4561c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edouard=20Choini=C3=A8re?= <27212526+echoix@users.noreply.github.com> Date: Sun, 6 Apr 2025 20:44:44 +0000 Subject: [PATCH 2/2] Revert setting zone_info.min and zone_info.max set to NAN, as it is currently initialized to 0. --- raster/r.univar/r.univar_main.c | 6 ++---- raster/r.univar/r3.univar_main.c | 8 ++++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/raster/r.univar/r.univar_main.c b/raster/r.univar/r.univar_main.c index 960df33869e..7a3cbc0c7c4 100644 --- a/raster/r.univar/r.univar_main.c +++ b/raster/r.univar/r.univar_main.c @@ -206,11 +206,9 @@ int main(int argc, char *argv[]) #endif /* table field separator */ zone_info.sep = G_option_to_separator(param.separator); - double nan_val; - sscanf("-nan", "%lf", &nan_val); - zone_info.min = nan_val; /* set to nan as default */ - zone_info.max = nan_val; /* set to nan as default */ + zone_info.min = 0; + zone_info.max = 0; zone_info.n_zones = 0; /* setting up thread workspace */ diff --git a/raster/r.univar/r3.univar_main.c b/raster/r.univar/r3.univar_main.c index ba54e807ccc..16664feda4d 100644 --- a/raster/r.univar/r3.univar_main.c +++ b/raster/r.univar/r3.univar_main.c @@ -144,10 +144,10 @@ int main(int argc, char *argv[]) /* table field separator */ zone_info.sep = G_option_to_separator(param.separator); - sscanf("-nan", "%lf", &dmin); /* set to nan as default */ - sscanf("-nan", "%lf", &dmax); /* set to nan as default */ - sscanf("-nan", "%lf", &zone_info.min); /* set to nan as default */ - sscanf("-nan", "%lf", &zone_info.max); /* set to nan as default */ + sscanf("-nan", "%lf", &dmin); /* set to nan as default */ + sscanf("-nan", "%lf", &dmax); /* set to nan as default */ + zone_info.min = 0; + zone_info.max = 0; zone_info.n_zones = 0; /* open 3D zoning raster with default region */