int main (void) { double d = NAN; double zero = 0.0; if (numeric_equal (d, d)) return 1; d = HUGE_VAL; if (!numeric_equal (d, 1.0 / zero)) return 1; return 0; }
bool _XEVOL_BASE_API_ XM_Inv(const xmat3& m1 , xmat3& mOut) { xmat3 m = m1; int max_r; //int max_c; float pivot = 1.0; mOut.identity(); for(int row = 0 ; row < 3 ; row++ ) { //选主元. pivot = m.m[row][row]; max_r = row; for( int i = row ; i < 3 ; i++ ) { float t = (float)fabs(m.m[i][row]); if( t > fabs(pivot)) { pivot = m.m[i][row]; max_r = i; } } //主元选定. if( numeric_equal(pivot,0) ) return false; //交换行 if(max_r != row) { XM_Swap(m.m[max_r][0],m.m[row][0]); XM_Swap(mOut.m[max_r][0],mOut.m[row][0]); XM_Swap(m.m[max_r][1],m.m[row][1]); XM_Swap(mOut.m[max_r][1],mOut.m[row][1]); XM_Swap(m.m[max_r][2],m.m[row][2]); XM_Swap(mOut.m[max_r][2],mOut.m[row][2]); } //归一化到1 for( int x = 0 ; x < 3 ; x ++) { mOut.m[row][x] /= pivot; m.m[row][x] /= pivot; } //消去当前列,除了当前行上的以外。该列全部成为0 for(int y = 0 ; y < 3 ; y ++) { if(y == row ) continue; float times = m.m[y][row]; //消去。 for (int x = 0 ; x < 3 ; x ++) { m.m[y][x] -= m.m[row][x] * times; mOut.m[y][x] -= mOut.m[row][x] * times; } } } return true; }
int spn_value_equal(const SpnValue *lhs, const SpnValue *rhs) { /* first, make sure that we compare values of the same type * (values of different types cannot possibly be equal) */ if (valtype(lhs) != valtype(rhs)) { return 0; } switch (valtype(lhs)) { case SPN_TTAG_NIL: { return 1; /* nil can only be nil */ } case SPN_TTAG_BOOL: { return boolvalue(lhs) == boolvalue(rhs); } case SPN_TTAG_NUMBER: { return numeric_equal(lhs, rhs); } case SPN_TTAG_STRING: case SPN_TTAG_ARRAY: case SPN_TTAG_HASHMAP: case SPN_TTAG_FUNC: { return spn_object_equal(objvalue(lhs), objvalue(rhs)); } case SPN_TTAG_USERINFO: { /* an object can not equal a non-object */ if (isobject(lhs) != isobject(rhs)) { return 0; } if (isobject(lhs)) { return spn_object_equal(objvalue(lhs), objvalue(rhs)); } else { return ptrvalue(lhs) == ptrvalue(rhs); } } default: SHANT_BE_REACHED(); } return 0; }