bool EXParser::isInf(double a) { return !isNan(a)&&isNan(a-a); }
bool EXParser::evaluateFunction(std::string &_expression, const int index, EXFunctionSet::iterator fiter) { std::string paramExpression = isolateParenthesisExpression(_expression, index); size_t expressionLen = paramExpression.length(); if(expressionLen == 0){ mErrorStr = "function parameter error"; return false; } if(!priorityLoop(paramExpression)) return false; double value = fiter->second((double)atof(paramExpression.c_str())); if(isInf(value)){ mErrorStr = "infinity error"; return false; } if(isNan(value)){ mErrorStr = "not a number error"; return false; } steps.push_back(EXSolveStep(fiter->first+"("+paramExpression+") -> "+dblToStr(value), "")); _expression.replace(index-fiter->first.length(), fiter->first.length()+expressionLen+2, dblToStr(value)); return true; }
int Port::isSignallingNan(long double r) { /* A signalling NaN is a NaN with 0 as the most significant bit of * its significand, which is bit 62 of 0..79 for 80 bit reals. */ return isNan(r) && !((((unsigned char*)&r)[7]) & 0x40); }
int DecimalUtil::quantum(Decimal64 x) { BSLS_ASSERT(!isInf(x)); BSLS_ASSERT(!isNan(x)); return decDoubleGetExponent(x.data()); }
int DecimalUtil::quantum(Decimal128 x) { BSLS_ASSERT(!isInf(x)); BSLS_ASSERT(!isNan(x)); return decQuadGetExponent(x.data()); }
int Port::isSignallingNan(double r) { /* A signalling NaN is a NaN with 0 as the most significant bit of * its significand, which is bit 51 of 0..63 for 64 bit doubles. */ return isNan(r) && !((((unsigned char*)&r)[6]) & 8); }
Real TriangularCharacteristicFunction::operator()( const Real val ) { Real r = (*m_left)(val); if(isNan(r)) return (*m_right)(val); return r; }
double angleBetweenVectors(Vector3 v1, Vector3 v2) { // normalize vectors v1.Normalize(); v2.Normalize(); // Get the dot product of the vectors double dotProduct = v1 * v2; // for acos, the value has to be between -1.0 and 1.0, but due to numerical // imprecisions it sometimes comes outside this range if (dotProduct > 1.0) dotProduct = 1.0; if (dotProduct < -1.0) dotProduct = -1.0; // Get the angle in radians between the 2 vectors // (should this be -acos ? ie, negative?) double angle = acos( dotProduct ); // Here we make sure that the angle is not a -1.#IND0000000 number, // which means indefinite if (isNan(angle)) return 0; // Return the angle in radians return angle; }
void rspfEcefPoint::print(std::ostream& os) const { if(isNan()) { os << "(rspfEcefPoint) " << "nan nan nan"; } os << "(rspfEcefPoint) " << theData; }
unsigned int floatToUint (float f) { if (isNegative (f) || isNan (f)) return 0; if (isInfinity (f) || f > UINT_MAX) return UINT_MAX; return (unsigned int) f; }
void EXParser::evaluateFunction(std::string &_expression, const int index, EXFunctionSet::iterator fiter) { std::string paramExpression = isolateParenthesisExpression(_expression, index); size_t expressionLen = paramExpression.length(); if(expressionLen == 0){ throw EXError("function_parameter_error", ErrorIndex::FUNCTION_PARAMETER_ERROR); } priorityLoop(paramExpression); double value = fiter->second((double)atof(paramExpression.c_str())); if(isInf(value)){ throw EXError("infinity_error", ErrorIndex::INFINITY_ERROR); } if(isNan(value)){ throw EXError("not_a_number", ErrorIndex::NAN_ERROR); } steps.push_back(EXSolveStep(fiter->first+"("+paramExpression+") -> "+dblToStr(value), "")); _expression.replace(index-fiter->first.length(), fiter->first.length()+expressionLen+2, dblToStr(value)); }
void EXParser::evaluateOperator(std::string & _expression, const int index, EXOperatorSet::iterator oiter) { if(oiter->first!='('){ std::string leftVal, rightVal, strVal; if((leftVal = getLeftOfOperator(_expression, index-1)).empty() || (rightVal = getRightOfOperator(_expression, index+1)).empty()){ throw EXError("operator_logic_error", ErrorIndex::OPERATOR_LOGIC_ERROR); } double value = oiter->second(strToDbl(leftVal.c_str()), strToDbl(rightVal.c_str())); if(isInf(value)){ throw EXError("infinity_error", ErrorIndex::INFINITY_ERROR); } if(isNan(value)){ throw EXError("not_a_number", ErrorIndex::NAN_ERROR); } _expression.replace(index-leftVal.length(), leftVal.length() + rightVal.length()+1, dblToStr(value)); } else{ evaluateParenthesis(_expression, index); } }
bool EXParser::evaluateOperator(std::string & _expression, const int index, EXOperatorSet::iterator oiter) { if(oiter->first!='('){ std::string leftVal, rightVal, strVal; if((leftVal = getLeftOfOperator(_expression, index-1)).empty() || (rightVal = getRightOfOperator(_expression, index+1)).empty()){ mErrorStr = "operator logic error"; return false; } double value = oiter->second(strToDbl(leftVal.c_str()), strToDbl(rightVal.c_str())); if(isInf(value)){ mErrorStr = "infinity error"; return false; } if(isNan(value)){ mErrorStr = "not a number"; return false; } _expression.replace(index-leftVal.length(), leftVal.length() + rightVal.length()+1, dblToStr(value)); } else{ evaluateParenthesis(_expression, index); } return true; }
/** @brief Checks **float/double** value for nan. @param v return true if **any** of the elements of the vector is *nan*. */ template<typename _Tp, int cn> inline bool isNan(const Vec<_Tp, cn>& v) { return isNan(v.val[0]) || isNan(v.val[1]) || isNan(v.val[2]); }
// // Do single unary node folding // TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType) { TConstUnion *unionArray = getUnionArrayPointer(); int objectSize = getType().getObjectSize(); // First, size the result, which is mostly the same as the argument's size, // but not always. TConstUnion* newConstArray; switch (op) { // TODO: functionality: constant folding: finish listing exceptions to size here case EOpDeterminant: case EOpAny: case EOpAll: case EOpLength: newConstArray = new TConstUnion[1]; break; case EOpEmitStreamVertex: case EOpEndStreamPrimitive: // These don't actually fold return 0; default: newConstArray = new TConstUnion[objectSize]; } // Process non-component-wise operations switch (op) { case EOpLength: case EOpNormalize: { double sum = 0; for (int i = 0; i < objectSize; i++) sum += double(unionArray[i].getDConst()) * unionArray[i].getDConst(); double length = sqrt(sum); if (op == EOpLength) newConstArray[0].setDConst(length); else { for (int i = 0; i < objectSize; i++) newConstArray[i].setDConst(unionArray[i].getDConst() / length); } break; } default: break; } for (int i = 0; i < objectSize; i++) { switch (op) { case EOpNegative: switch (getType().getBasicType()) { case EbtDouble: case EbtFloat: newConstArray[i].setDConst(-unionArray[i].getDConst()); break; case EbtInt: newConstArray[i].setIConst(-unionArray[i].getIConst()); break; case EbtUint: newConstArray[i].setUConst(static_cast<unsigned int>(-static_cast<int>(unionArray[i].getUConst()))); break; default: return 0; } break; case EOpLogicalNot: case EOpVectorLogicalNot: switch (getType().getBasicType()) { case EbtBool: newConstArray[i].setBConst(!unionArray[i].getBConst()); break; default: return 0; } break; case EOpBitwiseNot: newConstArray[i] = ~unionArray[i]; break; case EOpRadians: newConstArray[i].setDConst(unionArray[i].getDConst() * pi / 180.0); break; case EOpDegrees: newConstArray[i].setDConst(unionArray[i].getDConst() * 180.0 / pi); break; case EOpSin: newConstArray[i].setDConst(sin(unionArray[i].getDConst())); break; case EOpCos: newConstArray[i].setDConst(cos(unionArray[i].getDConst())); break; case EOpTan: newConstArray[i].setDConst(tan(unionArray[i].getDConst())); break; case EOpAsin: newConstArray[i].setDConst(asin(unionArray[i].getDConst())); break; case EOpAcos: newConstArray[i].setDConst(acos(unionArray[i].getDConst())); break; case EOpAtan: newConstArray[i].setDConst(atan(unionArray[i].getDConst())); break; case EOpLength: case EOpNormalize: // handled above as special case break; case EOpDPdx: case EOpDPdy: case EOpFwidth: // The derivatives are all mandated to create a constant 0. newConstArray[i].setDConst(0.0); break; case EOpExp: newConstArray[i].setDConst(exp(unionArray[i].getDConst())); break; case EOpLog: newConstArray[i].setDConst(log(unionArray[i].getDConst())); break; case EOpExp2: { const double inv_log2_e = 0.69314718055994530941723212145818; newConstArray[i].setDConst(exp(unionArray[i].getDConst() * inv_log2_e)); break; } case EOpLog2: { const double log2_e = 1.4426950408889634073599246810019; newConstArray[i].setDConst(log2_e * log(unionArray[i].getDConst())); break; } case EOpSqrt: newConstArray[i].setDConst(sqrt(unionArray[i].getDConst())); break; case EOpInverseSqrt: newConstArray[i].setDConst(1.0 / sqrt(unionArray[i].getDConst())); break; case EOpAbs: if (unionArray[i].getType() == EbtDouble) newConstArray[i].setDConst(fabs(unionArray[i].getDConst())); else if (unionArray[i].getType() == EbtInt) newConstArray[i].setIConst(abs(unionArray[i].getIConst())); else newConstArray[i] = unionArray[i]; break; case EOpSign: #define SIGN(X) (X == 0 ? 0 : (X < 0 ? -1 : 1)) if (unionArray[i].getType() == EbtDouble) newConstArray[i].setDConst(SIGN(unionArray[i].getDConst())); else newConstArray[i].setIConst(SIGN(unionArray[i].getIConst())); break; case EOpFloor: newConstArray[i].setDConst(floor(unionArray[i].getDConst())); break; case EOpTrunc: if (unionArray[i].getDConst() > 0) newConstArray[i].setDConst(floor(unionArray[i].getDConst())); else newConstArray[i].setDConst(ceil(unionArray[i].getDConst())); break; case EOpRound: newConstArray[i].setDConst(floor(0.5 + unionArray[i].getDConst())); break; case EOpRoundEven: { double flr = floor(unionArray[i].getDConst()); bool even = flr / 2.0 == floor(flr / 2.0); double rounded = even ? ceil(unionArray[i].getDConst() - 0.5) : floor(unionArray[i].getDConst() + 0.5); newConstArray[i].setDConst(rounded); break; } case EOpCeil: newConstArray[i].setDConst(ceil(unionArray[i].getDConst())); break; case EOpFract: { double x = unionArray[i].getDConst(); newConstArray[i].setDConst(x - floor(x)); break; } case EOpIsNan: { newConstArray[i].setBConst(isNan(unionArray[i].getDConst())); break; } case EOpIsInf: { newConstArray[i].setBConst(isInf(unionArray[i].getDConst())); break; } // TODO: Functionality: constant folding: the rest of the ops have to be fleshed out case EOpSinh: case EOpCosh: case EOpTanh: case EOpAsinh: case EOpAcosh: case EOpAtanh: case EOpFloatBitsToInt: case EOpFloatBitsToUint: case EOpIntBitsToFloat: case EOpUintBitsToFloat: case EOpPackSnorm2x16: case EOpUnpackSnorm2x16: case EOpPackUnorm2x16: case EOpUnpackUnorm2x16: case EOpPackHalf2x16: case EOpUnpackHalf2x16: case EOpDeterminant: case EOpMatrixInverse: case EOpTranspose: case EOpAny: case EOpAll: default: return 0; } } TIntermConstantUnion *newNode = new TIntermConstantUnion(newConstArray, returnType); newNode->getWritableType().getQualifier().storage = EvqConst; newNode->setLoc(getLoc()); return newNode; }
cv::viz::WMesh::WMesh(const Mesh &mesh) { CV_Assert(mesh.cloud.rows == 1 && mesh.polygons.type() == CV_32SC1); vtkSmartPointer<vtkCloudMatSource> source = vtkSmartPointer<vtkCloudMatSource>::New(); source->SetColorCloudNormalsTCoords(mesh.cloud, mesh.colors, mesh.normals, mesh.tcoords); source->Update(); Mat lookup_buffer(1, (int)mesh.cloud.total(), CV_32SC1); int *lookup = lookup_buffer.ptr<int>(); for(int y = 0, index = 0; y < mesh.cloud.rows; ++y) { int s_chs = mesh.cloud.channels(); if (mesh.cloud.depth() == CV_32F) { const float* srow = mesh.cloud.ptr<float>(y); const float* send = srow + mesh.cloud.cols * s_chs; for (; srow != send; srow += s_chs, ++lookup) if (!isNan(srow[0]) && !isNan(srow[1]) && !isNan(srow[2])) *lookup = index++; } if (mesh.cloud.depth() == CV_64F) { const double* srow = mesh.cloud.ptr<double>(y); const double* send = srow + mesh.cloud.cols * s_chs; for (; srow != send; srow += s_chs, ++lookup) if (!isNan(srow[0]) && !isNan(srow[1]) && !isNan(srow[2])) *lookup = index++; } } lookup = lookup_buffer.ptr<int>(); vtkSmartPointer<vtkPolyData> polydata = source->GetOutput(); polydata->SetVerts(0); const int * polygons = mesh.polygons.ptr<int>(); vtkSmartPointer<vtkCellArray> cell_array = vtkSmartPointer<vtkCellArray>::New(); int idx = 0; size_t polygons_size = mesh.polygons.total(); for (size_t i = 0; i < polygons_size; ++idx) { int n_points = polygons[i++]; cell_array->InsertNextCell(n_points); for (int j = 0; j < n_points; ++j, ++idx) cell_array->InsertCellPoint(lookup[polygons[i++]]); } cell_array->GetData()->SetNumberOfValues(idx); cell_array->Squeeze(); polydata->SetStrips(cell_array); vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetScalarModeToUsePointData(); #if VTK_MAJOR_VERSION < 8 mapper->ImmediateModeRenderingOff(); #endif VtkUtils::SetInputData(mapper, polydata); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); //actor->SetNumberOfCloudPoints(std::max(1, polydata->GetNumberOfPoints() / 10)); actor->GetProperty()->SetRepresentationToSurface(); actor->GetProperty()->BackfaceCullingOff(); // Backface culling is off for higher efficiency actor->GetProperty()->SetInterpolationToFlat(); actor->GetProperty()->EdgeVisibilityOff(); actor->GetProperty()->ShadingOff(); actor->SetMapper(mapper); if (!mesh.texture.empty()) { vtkSmartPointer<vtkImageMatSource> image_source = vtkSmartPointer<vtkImageMatSource>::New(); image_source->SetImage(mesh.texture); vtkSmartPointer<vtkTexture> texture = vtkSmartPointer<vtkTexture>::New(); texture->SetInputConnection(image_source->GetOutputPort()); actor->SetTexture(texture); } WidgetAccessor::setProp(*this, actor); }
bool rspfDpt::isEqualTo(const rspfDpt& rhs, rspfCompareType /* compareType */)const { if(rhs.isNan()&&isNan()) return true; return (rspf::almostEqual(x, rhs.x)&& rspf::almostEqual(y, rhs.y)); }
QString StarWrapper1::getInfoString(const StelCore *core, const InfoStringGroup& flags) const { QString str; QTextStream oss(&str); if (s->hip) { if ((flags&Name) || (flags&CatalogNumber)) oss << "<h2>"; const QString commonNameI18 = StarMgr::getCommonName(s->hip); const QString sciName = StarMgr::getSciName(s->hip); bool nameWasEmpty=true; if (flags&Name) { if (commonNameI18!="" || sciName!="") { oss << commonNameI18 << (commonNameI18 == "" ? "" : " "); if (commonNameI18!="" && sciName!="") oss << "("; oss << (sciName=="" ? "" : sciName); if (commonNameI18!="" && sciName!="") oss << ")"; nameWasEmpty=false; } } if ((flags&CatalogNumber) && (flags&Name) && !nameWasEmpty) oss << " - "; if (flags&CatalogNumber || (nameWasEmpty && (flags&Name))) oss << "HIP " << s->hip; if (s->componentIds) oss << " " << StarMgr::convertToComponentIds(s->componentIds); if ((flags&Name) || (flags&CatalogNumber)) oss << "</h2>"; } if (flags&Magnitude) { if (core->getSkyDrawer()->getFlagHasAtmosphere()) oss << q_("Magnitude: <b>%1</b> (extincted to: <b>%2</b>. B-V: <b>%3</b>)").arg(QString::number(getVMagnitude(core, false), 'f', 2), QString::number(getVMagnitude(core, true), 'f', 2), QString::number(s->getBV(), 'f', 2)) << "<br>"; else oss << q_("Magnitude: <b>%1</b> (B-V: <b>%2</b>)").arg(QString::number(getVMagnitude(core, false), 'f', 2), QString::number(s->getBV(), 'f', 2)) << "<br>"; } if ((flags&AbsoluteMagnitude) && s->plx && !isNan(s->plx) && !isInf(s->plx)) oss << q_("Absolute Magnitude: %1").arg(getVMagnitude(core, false)+5.*(1.+std::log10(0.00001*s->plx)), 0, 'f', 2) << "<br>"; oss << getPositionInfoString(core, flags); if (s->spInt && flags&Extra1) { oss << q_("Spectral Type: %1").arg(StarMgr::convertToSpectralType(s->spInt)) << "<br>"; } if ((flags&Distance) && s->plx && !isNan(s->plx) && !isInf(s->plx)) oss << q_("Distance: %1 Light Years").arg((AU/(SPEED_OF_LIGHT*86400*365.25)) / (s->plx*((0.00001/3600)*(M_PI/180))), 0, 'f', 2) << "<br>"; if (s->plx && flags&Extra2) oss << q_("Parallax: %1\"").arg(0.00001*s->plx, 0, 'f', 5) << "<br>"; StelObject::postProcessInfoString(str, flags); return str; }
/** @brief Checks **float/double** value for nan. @param p return true if **any** of the elements of the point is *nan*. */ template<typename _Tp> inline bool isNan(const Point3_<_Tp>& p) { return isNan(p.x) || isNan(p.y) || isNan(p.z); }
bool isFin(float f) { return !isInf(f) && !isNan(f); }
bool DecimalUtil::isUnordered(Decimal128 x, Decimal128 y) { return isNan(x) || isNan(y); }
template<typename _Tp> inline bool isNan(const _Tp* data) { return isNan(data[0]) || isNan(data[1]) || isNan(data[2]); }
cv::viz::WCloudNormals::WCloudNormals(InputArray _cloud, InputArray _normals, int level, double scale, const Color &color) { Mat cloud = _cloud.getMat(); Mat normals = _normals.getMat(); CV_Assert(cloud.type() == CV_32FC3 || cloud.type() == CV_64FC3 || cloud.type() == CV_32FC4 || cloud.type() == CV_64FC4); CV_Assert(cloud.size() == normals.size() && cloud.type() == normals.type()); int sqlevel = (int)std::sqrt((double)level); int ystep = (cloud.cols > 1 && cloud.rows > 1) ? sqlevel : 1; int xstep = (cloud.cols > 1 && cloud.rows > 1) ? sqlevel : level; vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New(); points->SetDataType(cloud.depth() == CV_32F ? VTK_FLOAT : VTK_DOUBLE); vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New(); int s_chs = cloud.channels(); int n_chs = normals.channels(); int total = 0; for(int y = 0; y < cloud.rows; y += ystep) { if (cloud.depth() == CV_32F) { const float *srow = cloud.ptr<float>(y); const float *send = srow + cloud.cols * s_chs; const float *nrow = normals.ptr<float>(y); for (; srow < send; srow += xstep * s_chs, nrow += xstep * n_chs) if (!isNan(srow) && !isNan(nrow)) { Vec3f endp = Vec3f(srow) + Vec3f(nrow) * (float)scale; points->InsertNextPoint(srow); points->InsertNextPoint(endp.val); lines->InsertNextCell(2); lines->InsertCellPoint(total++); lines->InsertCellPoint(total++); } } else { const double *srow = cloud.ptr<double>(y); const double *send = srow + cloud.cols * s_chs; const double *nrow = normals.ptr<double>(y); for (; srow < send; srow += xstep * s_chs, nrow += xstep * n_chs) if (!isNan(srow) && !isNan(nrow)) { Vec3d endp = Vec3d(srow) + Vec3d(nrow) * (double)scale; points->InsertNextPoint(srow); points->InsertNextPoint(endp.val); lines->InsertNextCell(2); lines->InsertCellPoint(total++); lines->InsertCellPoint(total++); } } } vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New(); polydata->SetPoints(points); polydata->SetLines(lines); VtkUtils::FillScalars(polydata, color); vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New(); VtkUtils::SetInputData(mapper, polydata); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); WidgetAccessor::setProp(*this, actor); }