Rename our isnan() function to IsReasonable().

Commit ea6db67 added an unusual isnan macro:

  #define isnan(x) (((x) != (x)) || (x > 1e11) || (x < -1e11))

Commit 8bc322e adds a preprocessor guard that looks like it would
cause the isnan function from math.h to be preferred, but doesn't
actually do that on many platforms, e.g. glibc:

  #ifndef isnan
  #   define isnan(x) (((x) != (x)) || (x > 1e11) || (x < -1e11))
  #endif

This commit renames our isnan() to make it clear that it differs
from the standard library operation, and makes it a function.

Fixes #603.
pull/612/head
whitequark 2020-05-12 13:59:23 +00:00
parent 771086fa50
commit 0be42a8b29
5 changed files with 11 additions and 11 deletions

View File

@ -448,7 +448,7 @@ bool TextWindow::EditControlDoneForConfiguration(const std::string &s) {
Expr *e = Expr::From(s, /*popUpError=*/true);
if(e) {
double ev = e->Eval();
if(fabs(ev) < 0.001 || isnan(ev)) {
if(fabs(ev) < 0.001 || IsReasonable(ev)) {
Error(_("Export scale must not be zero!"));
} else {
SS.exportScale = (float)ev;
@ -460,7 +460,7 @@ bool TextWindow::EditControlDoneForConfiguration(const std::string &s) {
Expr *e = Expr::From(s, /*popUpError=*/true);
if(e) {
double ev = SS.ExprToMm(e);
if(isnan(ev) || ev < 0) {
if(IsReasonable(ev) || ev < 0) {
Error(_("Cutter radius offset must not be negative!"));
} else {
SS.exportOffset = (float)ev;

View File

@ -383,7 +383,7 @@ void GraphicsWindow::MakeTangentArc() {
if(fabs(tp[0] - t[0]) > 1e-3 || fabs(tp[1] - t[1]) > 1e-3 ||
t[0] < 0.01 || t[1] < 0.01 ||
t[0] > 0.99 || t[1] > 0.99 ||
isnan(t[0]) || isnan(t[1]))
IsReasonable(t[0]) || IsReasonable(t[1]))
{
Error(_("Couldn't round this corner. Try a smaller radius, or try "
"creating the desired geometry by hand with tangency "

View File

@ -76,10 +76,6 @@ typedef struct _cairo_surface cairo_surface_t;
dbp("tri: (%.3f %.3f %.3f) (%.3f %.3f %.3f) (%.3f %.3f %.3f)", \
CO((tri).a), CO((tri).b), CO((tri).c))
#ifndef isnan
# define isnan(x) (((x) != (x)) || (x > 1e11) || (x < -1e11))
#endif
namespace SolveSpace {
using std::min;
@ -98,6 +94,10 @@ __attribute__((__format__ (__printf__, 1, 2)))
#endif
std::string ssprintf(const char *fmt, ...);
inline bool IsReasonable(double x) {
return std::isnan(x) || x > 1e11 || x < -1e11;
}
inline int WRAP(int v, int n) {
// Clamp it to the range [0, n)
while(v >= n) v -= n;

View File

@ -443,7 +443,7 @@ void SSurface::ClosestPointTo(Vector p, double *u, double *v, bool mustConverge)
dbp("want %.3f %.3f %.3f", CO(p));
dbp("distance = %g", (p.Minus(p0)).Magnitude());
}
if(isnan(*u) || isnan(*v)) {
if(IsReasonable(*u) || IsReasonable(*v)) {
*u = *v = 0;
}
}

View File

@ -293,7 +293,7 @@ bool System::NewtonSolve(int tag) {
for(i = 0; i < mat.n; i++) {
Param *p = param.FindById(mat.param[i]);
p->val -= mat.X[i];
if(isnan(p->val)) {
if(IsReasonable(p->val)) {
// Very bad, and clearly not convergent
return false;
}
@ -306,7 +306,7 @@ bool System::NewtonSolve(int tag) {
// Check for convergence
converged = true;
for(i = 0; i < mat.m; i++) {
if(isnan(mat.B.num[i])) {
if(IsReasonable(mat.B.num[i])) {
return false;
}
if(fabs(mat.B.num[i]) > CONVERGE_TOLERANCE) {
@ -493,7 +493,7 @@ didnt_converge:
SK.constraint.ClearTags();
// Not using range-for here because index is used in additional ways
for(i = 0; i < eq.n; i++) {
if(fabs(mat.B.num[i]) > CONVERGE_TOLERANCE || isnan(mat.B.num[i])) {
if(fabs(mat.B.num[i]) > CONVERGE_TOLERANCE || IsReasonable(mat.B.num[i])) {
// This constraint is unsatisfied.
if(!mat.eq[i].isFromConstraint()) continue;