Thread: [brlcad-commits] SF.net SVN: brlcad:[41119] brlcad/trunk/src/libbn/ulp.c
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <br...@us...> - 2010-10-21 05:51:45
|
Revision: 41119 http://brlcad.svn.sourceforge.net/brlcad/?rev=41119&view=rev Author: brlcad Date: 2010-10-21 05:51:39 +0000 (Thu, 21 Oct 2010) Log Message: ----------- yeah, assumes IEEE too Modified Paths: -------------- brlcad/trunk/src/libbn/ulp.c Modified: brlcad/trunk/src/libbn/ulp.c =================================================================== --- brlcad/trunk/src/libbn/ulp.c 2010-10-21 05:49:51 UTC (rev 41118) +++ brlcad/trunk/src/libbn/ulp.c 2010-10-21 05:51:39 UTC (rev 41119) @@ -30,6 +30,9 @@ * * This file is completely in flux, incomplete, limited, and subject * to drastic changes. Do NOT use it for anything. + * + * It also assumes an IEEE 754 compliant floating point + * representation. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2010-11-18 15:17:50
|
Revision: 41402 http://brlcad.svn.sourceforge.net/brlcad/?rev=41402&view=rev Author: brlcad Date: 2010-11-18 15:17:43 +0000 (Thu, 18 Nov 2010) Log Message: ----------- check for c89 float.h constants and use those instead of calculating epsilon if the constants are available. also added method that does not assume ieee754 but it may find a smaller epsilon than ieee specifies. Modified Paths: -------------- brlcad/trunk/src/libbn/ulp.c Modified: brlcad/trunk/src/libbn/ulp.c =================================================================== --- brlcad/trunk/src/libbn/ulp.c 2010-11-17 23:10:22 UTC (rev 41401) +++ brlcad/trunk/src/libbn/ulp.c 2010-11-18 15:17:43 UTC (rev 41402) @@ -35,22 +35,46 @@ * representation. */ +#include "common.h" +#include <float.h> + + double bn_epsilon() { +#if defined(DBL_EPSILON) + return DBL_EPSILON; +#elif defined(HAVE_IEEE754) static const double val = 1.0; register long long next = *(long long*)&val + 1; return val - *(double *)&next; +#else + /* must be volatile to avoid long registers */ + volatile double tol = 1.0; + while (1.0 + (tol * 0.5) != 1.0) { + tol *= 0.5; + } +#endif } -double +float bn_epsilonf() { +#if defined(FLT_EPSILON) + return FLT_EPSILON; +#elif defined(HAVE_IEEE754) static const float val = 1.0; register long next = *(long*)&val + 1; return val - *(float *)&next; +#else + /* must be volatile to avoid long registers */ + volatile float tol = 1.0f; + while (1.0f + (tol * 0.5f) != 1.0f) { + tol *= 0.5f; + } +#endif } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2012-11-07 03:14:00
|
Revision: 53482 http://brlcad.svn.sourceforge.net/brlcad/?rev=53482&view=rev Author: brlcad Date: 2012-11-07 03:13:54 +0000 (Wed, 07 Nov 2012) Log Message: ----------- implement routines to also calculate the sqrt() of the min/max for floats and doubles. Modified Paths: -------------- brlcad/trunk/src/libbn/ulp.c Modified: brlcad/trunk/src/libbn/ulp.c =================================================================== --- brlcad/trunk/src/libbn/ulp.c 2012-11-07 02:55:23 UTC (rev 53481) +++ brlcad/trunk/src/libbn/ulp.c 2012-11-07 03:13:54 UTC (rev 53482) @@ -24,7 +24,7 @@ * Place (ULP). * * In this context, ULP is the distance to the next normalized - * floating point value larger that a given input value. + * floating point value larger than a given input value. * * TODO: handle NaN, +-Inf, underflow, overflow, non-IEEE, float.h * @@ -113,6 +113,34 @@ double +bn_flt_min_sqrt() +{ + return sqrt(flt_min()); +} + + +double +bn_flt_max_sqrt() +{ + return sqrt(flt_max()); +} + + +double +bn_dbl_min_sqrt() +{ + return sqrt(dbl_min()); +} + + +double +bn_dbl_max_sqrt() +{ + return sqrt(dbl_max()); +} + + +double bn_ulp(double val) { double next; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <br...@us...> - 2012-11-07 04:16:44
|
Revision: 53483 http://brlcad.svn.sourceforge.net/brlcad/?rev=53483&view=rev Author: brlcad Date: 2012-11-07 04:16:38 +0000 (Wed, 07 Nov 2012) Log Message: ----------- fix routines for calculating the square root, missing bn_ prefix. remove register keyword since we take the variable's address. fix the equality comparison, testing for >val instead. Modified Paths: -------------- brlcad/trunk/src/libbn/ulp.c Modified: brlcad/trunk/src/libbn/ulp.c =================================================================== --- brlcad/trunk/src/libbn/ulp.c 2012-11-07 03:13:54 UTC (rev 53482) +++ brlcad/trunk/src/libbn/ulp.c 2012-11-07 04:16:38 UTC (rev 53483) @@ -19,6 +19,9 @@ */ /** @file libbn/ulp.c * + * NOTE: This is a work-in-progress and not yet published API to be + * used anywhere. DO NOT USE. + * * Routines useful for performing comparisons and dynamically * calculating floating point limits including the Unit in the Last * Place (ULP). @@ -37,9 +40,15 @@ #include "common.h" -#include <float.h> +#include <math.h> +#include <limits.h> +#ifdef HAVE_FLOAT_H +# include <float.h> +#endif +/* #define HAVE_IEEE754 1 */ + double bn_epsilon() { @@ -47,14 +56,15 @@ return DBL_EPSILON; #elif defined(HAVE_IEEE754) static const double val = 1.0; - register long long next = *(long long*)&val + 1; + long long next = *(long long*)&val + 1; return val - *(double *)&next; #else /* must be volatile to avoid long registers */ volatile double tol = 1.0; - while (1.0 + (tol * 0.5) != 1.0) { + while (1.0 + (tol * 0.5) > 1.0) { tol *= 0.5; } + return tol; #endif } @@ -66,14 +76,15 @@ return FLT_EPSILON; #elif defined(HAVE_IEEE754) static const float val = 1.0; - register long next = *(long*)&val + 1; + long next = *(long*)&val + 1; return val - *(float *)&next; #else /* must be volatile to avoid long registers */ volatile float tol = 1.0f; - while (1.0f + (tol * 0.5f) != 1.0f) { + while (1.0f + (tol * 0.5f) > 1.0f) { tol *= 0.5f; } + return tol; #endif } @@ -81,7 +92,7 @@ double bn_dbl_min() { - register long long val = (1LL<<52); + long long val = (1LL<<52); return *(double *)&val; } @@ -90,7 +101,7 @@ bn_dbl_max() { static const double val = INFINITY; - register long long next = *(long long*)&val - 1; + long long next = *(long long*)&val - 1; return *(double *)&next; } @@ -98,7 +109,7 @@ double bn_flt_min() { - register long val = (1LL<<23); + long val = (1LL<<23); return *(float *)&val; } @@ -107,7 +118,7 @@ bn_flt_max() { static const float val = INFINITY; - register long next = *(long*)&val - 1; + long next = *(long*)&val - 1; return *(float *)&next; } @@ -115,36 +126,35 @@ double bn_flt_min_sqrt() { - return sqrt(flt_min()); + return sqrt(bn_flt_min()); } double bn_flt_max_sqrt() { - return sqrt(flt_max()); + return sqrt(bn_flt_max()); } double bn_dbl_min_sqrt() { - return sqrt(dbl_min()); + return sqrt(bn_dbl_min()); } double bn_dbl_max_sqrt() { - return sqrt(dbl_max()); + return sqrt(bn_dbl_max()); } double bn_ulp(double val) { - double next; - register long long up, dn, idx; + long long up, dn; if (isnan(val) || !isfinite(val)) return val; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <eri...@us...> - 2012-11-15 15:39:17
|
Revision: 53702 http://brlcad.svn.sourceforge.net/brlcad/?rev=53702&view=rev Author: erikgreenwald Date: 2012-11-15 15:39:06 +0000 (Thu, 15 Nov 2012) Log Message: ----------- tweak bu_dbl_max and bu_flt_max to compiled on win32/msvc. Modified Paths: -------------- brlcad/trunk/src/libbn/ulp.c Modified: brlcad/trunk/src/libbn/ulp.c =================================================================== --- brlcad/trunk/src/libbn/ulp.c 2012-11-15 14:24:47 UTC (rev 53701) +++ brlcad/trunk/src/libbn/ulp.c 2012-11-15 15:39:06 UTC (rev 53702) @@ -100,9 +100,15 @@ double bn_dbl_max() { - static const double val = INFINITY; +#if defined(DBL_MAX) + return DBL_MAX; +#elif defined(INFINITY) + static const double val = INFINITY long long next = *(long long*)&val - 1; return *(double *)&next; +#else + return 1.0/bu_dbl_min(); +#endif } @@ -117,9 +123,15 @@ double bn_flt_max() { +#if defined(FLT_MAX) + return FLT_MAX; +#elif defined(INFINITY) static const float val = INFINITY; long next = *(long*)&val - 1; return *(float *)&next; +#else + return 1.0/bu_flt_min(); +#endif } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2012-11-15 16:11:25
|
Revision: 53705 http://brlcad.svn.sourceforge.net/brlcad/?rev=53705&view=rev Author: starseeker Date: 2012-11-15 16:11:14 +0000 (Thu, 15 Nov 2012) Log Message: ----------- Missing semicolon Modified Paths: -------------- brlcad/trunk/src/libbn/ulp.c Modified: brlcad/trunk/src/libbn/ulp.c =================================================================== --- brlcad/trunk/src/libbn/ulp.c 2012-11-15 16:07:47 UTC (rev 53704) +++ brlcad/trunk/src/libbn/ulp.c 2012-11-15 16:11:14 UTC (rev 53705) @@ -103,7 +103,7 @@ #if defined(DBL_MAX) return DBL_MAX; #elif defined(INFINITY) - static const double val = INFINITY + static const double val = INFINITY; long long next = *(long long*)&val - 1; return *(double *)&next; #else This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <eri...@us...> - 2012-11-19 16:01:45
|
Revision: 53745 http://brlcad.svn.sourceforge.net/brlcad/?rev=53745&view=rev Author: erikgreenwald Date: 2012-11-19 16:01:33 +0000 (Mon, 19 Nov 2012) Log Message: ----------- double/float min funcs are in bn, not bu Modified Paths: -------------- brlcad/trunk/src/libbn/ulp.c Modified: brlcad/trunk/src/libbn/ulp.c =================================================================== --- brlcad/trunk/src/libbn/ulp.c 2012-11-18 21:52:51 UTC (rev 53744) +++ brlcad/trunk/src/libbn/ulp.c 2012-11-19 16:01:33 UTC (rev 53745) @@ -107,7 +107,7 @@ long long next = *(long long*)&val - 1; return *(double *)&next; #else - return 1.0/bu_dbl_min(); + return 1.0/bn_dbl_min(); #endif } @@ -130,7 +130,7 @@ long next = *(long*)&val - 1; return *(float *)&next; #else - return 1.0/bu_flt_min(); + return 1.0/bn_flt_min(); #endif } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <eri...@us...> - 2012-11-19 16:08:10
|
Revision: 53746 http://brlcad.svn.sourceforge.net/brlcad/?rev=53746&view=rev Author: erikgreenwald Date: 2012-11-19 16:07:59 +0000 (Mon, 19 Nov 2012) Log Message: ----------- isfinite() is a c99 macro, so use the old isinf() Modified Paths: -------------- brlcad/trunk/src/libbn/ulp.c Modified: brlcad/trunk/src/libbn/ulp.c =================================================================== --- brlcad/trunk/src/libbn/ulp.c 2012-11-19 16:01:33 UTC (rev 53745) +++ brlcad/trunk/src/libbn/ulp.c 2012-11-19 16:07:59 UTC (rev 53746) @@ -168,7 +168,7 @@ { long long up, dn; - if (isnan(val) || !isfinite(val)) + if (isnan(val) || isinf(val)) return val; if (val >=0) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <eri...@us...> - 2012-11-20 16:58:12
|
Revision: 53780 http://brlcad.svn.sourceforge.net/brlcad/?rev=53780&view=rev Author: erikgreenwald Date: 2012-11-20 16:58:05 +0000 (Tue, 20 Nov 2012) Log Message: ----------- Define isinf() and isnan() for msvc. Modified Paths: -------------- brlcad/trunk/src/libbn/ulp.c Modified: brlcad/trunk/src/libbn/ulp.c =================================================================== --- brlcad/trunk/src/libbn/ulp.c 2012-11-20 16:07:27 UTC (rev 53779) +++ brlcad/trunk/src/libbn/ulp.c 2012-11-20 16:58:05 UTC (rev 53780) @@ -48,6 +48,10 @@ /* #define HAVE_IEEE754 1 */ +#ifdef _MSC_VER +# define isnan(x) _isnan(x) +# define isinf(x) (!_finite(x)) +#endif double bn_epsilon() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <eri...@us...> - 2012-11-20 20:49:58
|
Revision: 53784 http://brlcad.svn.sourceforge.net/brlcad/?rev=53784&view=rev Author: erikgreenwald Date: 2012-11-20 20:49:51 +0000 (Tue, 20 Nov 2012) Log Message: ----------- use the isnan and isinf from config_win.h Modified Paths: -------------- brlcad/trunk/src/libbn/ulp.c Modified: brlcad/trunk/src/libbn/ulp.c =================================================================== --- brlcad/trunk/src/libbn/ulp.c 2012-11-20 20:49:28 UTC (rev 53783) +++ brlcad/trunk/src/libbn/ulp.c 2012-11-20 20:49:51 UTC (rev 53784) @@ -48,11 +48,6 @@ /* #define HAVE_IEEE754 1 */ -#ifdef _MSC_VER -# define isnan(x) _isnan(x) -# define isinf(x) (!_finite(x)) -#endif - double bn_epsilon() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sta...@us...> - 2015-06-19 20:03:51
|
Revision: 65424 http://sourceforge.net/p/brlcad/code/65424 Author: starseeker Date: 2015-06-19 20:03:49 +0000 (Fri, 19 Jun 2015) Log Message: ----------- float.h is C89 Modified Paths: -------------- brlcad/trunk/src/libbn/ulp.c Modified: brlcad/trunk/src/libbn/ulp.c =================================================================== --- brlcad/trunk/src/libbn/ulp.c 2015-06-19 19:50:23 UTC (rev 65423) +++ brlcad/trunk/src/libbn/ulp.c 2015-06-19 20:03:49 UTC (rev 65424) @@ -42,9 +42,7 @@ #include <math.h> #include <limits.h> -#ifdef HAVE_FLOAT_H -# include <float.h> -#endif +#include <float.h> /* #define HAVE_IEEE754 1 */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |