void test_fx_fixed_limits_double(ostream& out)
{
  out << "****************** limits fx_fixed<8, 5>_double\n";

  sc_fixed<8, 5> zero_min("-0");     SHOW(zero_min);
  sc_fixed<8, 5> zero_plus("+0");    SHOW(zero_plus);
  sc_fixed<8, 5> zero(0);            SHOW(zero);
  
  sc_fixed<8, 5> long_max(LONG_MAX); SHOW(long_max);
  sc_fixed<8, 5> long_min(LONG_MIN); SHOW(long_min);
  sc_fixed<8, 5> int_max(INT_MAX);   SHOW(int_max);
  sc_fixed<8, 5> int_min(INT_MIN);   SHOW(int_min);
  sc_fixed<8, 5> uint_max(UINT_MAX); SHOW(uint_max);
  sc_fixed<8, 5> ulong_max(ULONG_MAX); SHOW(ulong_max);

  sc_fixed<8, 5> double_min(DBL_MIN); SHOW(double_min);
  sc_fixed<8, 5> double_max(DBL_MAX); SHOW(double_max);
  sc_fixed<8, 5> float_min(FLT_MIN);  SHOW(float_min);
  sc_fixed<8, 5> float_max(FLT_MAX);  SHOW(float_max);

  // sc_fixed<8, 5> res;


  // SHOW_EXPS(double_min);
  // SHOW_EXPS(double_max);
  // SHOW_EXPS(float_min);
  // SHOW_EXPS(float_max);
}
void test_fx_fix_limits_long(ostream& out)
{
  out << "****************** limits fx_fix_long\n";

  sc_fix zero_min("-0");     SHOW(zero_min);
  sc_fix zero_plus("+0");    SHOW(zero_plus);
  sc_fix zero(0);            SHOW(zero);
  
  sc_fix long_max(LONG_MAX); SHOW(long_max);
  sc_fix long_min(LONG_MIN); SHOW(long_min);
  sc_fix int_max(INT_MAX);   SHOW(int_max);
  sc_fix int_min(INT_MIN);   SHOW(int_min);
  sc_fix uint_max(UINT_MAX); SHOW(uint_max);
  sc_fix ulong_max(ULONG_MAX); SHOW(ulong_max);

  sc_fix double_min(DBL_MIN); SHOW(double_min);
  sc_fix double_max(DBL_MAX); SHOW(double_max);
  sc_fix float_min(FLT_MIN);  SHOW(float_min);
  sc_fix float_max(FLT_MAX);  SHOW(float_max);

  // sc_fix res;


  // SHOW_EXPS(long_max);
  // SHOW_EXPS(long_min);
  // SHOW_EXPS(int_max);
  // SHOW_EXPS(int_min);
  // SHOW_EXPS(uint_max);
  // SHOW_EXPS(ulong_max);
}
void test_fx_float_limits_zero(ostream& out)
{
  cerr << "****************** limits fx_float_zero\n";

  sc_fxval zero_min("-0");     SHOW(zero_min);
  sc_fxval zero_plus("+0");    SHOW(zero_plus);
  sc_fxval zero(0);            SHOW(zero);
  
  sc_fxval nan("NaN");         SHOW(nan);
  sc_fxval inf_plus("+Inf");   SHOW(inf_plus);
  sc_fxval inf_min("-Inf");    SHOW(inf_min);
  sc_fxval inf("Inf");         SHOW(inf);

  sc_fxval long_max(LONG_MAX); SHOW(long_max);
  sc_fxval long_min(LONG_MIN); SHOW(long_min);
  sc_fxval int_max(INT_MAX);   SHOW(int_max);
  sc_fxval int_min(INT_MIN);   SHOW(int_min);
  sc_fxval uint_max(UINT_MAX); SHOW(uint_max);
  sc_fxval ulong_max(ULONG_MAX); SHOW(ulong_max);

  sc_fxval double_min(DBL_MIN); SHOW(double_min);
  sc_fxval double_max(DBL_MAX); SHOW(double_max);
  sc_fxval float_min(FLT_MIN);  SHOW(float_min);
  sc_fxval float_max(FLT_MAX);  SHOW(float_max);

  sc_fxval res;


  SHOW_EXPS(zero_min);
  SHOW_EXPS(zero_plus);
  SHOW_EXPS(zero);
}
Beispiel #4
0
/**
    Solving quadratic equation
    x, y - relative present position of second ball
    dx, dy - relative displacement of first ball (second is immobile in this equation)
    d - sum of radiuses
    dr - change in radius sum in this quantum of time

    This function is good both for mobile and immobile balls or points,
    that change size or not :)
    */
long double check_collision_between_two_balls(long double x, long double y, long double dx, long double dy,
                                         long double d, long double dr){
    long double a = dx * dx + dy * dy - dr * dr,
        b = 2 * (x * dx + y * dy - d * dr);
    if(a == 0){//linear
        if(b == 0){
            return EMPTY_COLLISION_TIME;
        }else{
            b = -(x * x + y * y - d * d) / b;
            if(b <= 0 && b >= 1){
                return b;
            }else{
                return EMPTY_COLLISION_TIME;
            }
        }
    }else{
        d *= d;
        d = b * b - 4 * a * (x * x + y * y - d);//delta
        if(d < 0){
            return EMPTY_COLLISION_TIME;
        }else{
            b = -b;
            a *= 2;
            if(d == 0){
                b /= a;
                if(b >= 0 && b <= 1){
                    return b;
                }
                else{
                    return EMPTY_COLLISION_TIME;
                }
            }else{
                d = sqrt(d);
                x = (b + d) / a;
                y = (b - d) / a;
                if(x >= 0 && x <= 1){
                    if(y >= 0 && y <= 1){
                        return double_min(x, y);
                    }else{
                        return x;
                    }
                }else{
                    if(y >= 0 && y <= 1){
                        return y;
                    }else{
                        return EMPTY_COLLISION_TIME;
                    }
                }
            }
        }
    }
}
Beispiel #5
0
int main() {
	printf("Floating point information:\n");
	printf("float radix: %d\n", FLT_RADIX);
	printf("float exponent size: %d (%d bits)\n",
		FLT_MAX_EXP, bits(FLT_MAX_EXP));
	printf("double exponent size: %d (%d bits)\n",
		DBL_MAX_EXP, bits(DBL_MAX_EXP));
	printf("long double exponent size: %d (%d bits)\n",
		LDBL_MAX_EXP, bits(LDBL_MAX_EXP));
	printf("Ranges:\n");
	printf("float: [%f, %f]\n", float_min(), float_max());
	printf("float: [%f, %f] (system)\n", FLT_MIN, FLT_MAX);
	printf("double: [%f, %f]\n", double_min(), double_max());
	printf("double: [%f, %f] (system)\n", DBL_MIN, DBL_MAX);
	printf("long double: [%Lf, %Lf]\n", dlong_min(), dlong_max());
	printf("long double: [%Lf, %Lf] (system)\n", LDBL_MIN, LDBL_MAX);
	return 0;
}
Beispiel #6
0
int main()
{
    printf("\nFixed Point\n");
    printf("____________\n\n");
    printf("\nBy Calculation.\n\n");
    fixed_range();
    printf("\nFrom limits.h\n\n");
    header_limits_range();
    printf("\nFloating Point");
    printf("\n________________\n\n");
    printf("\nBy Calculation.\n\n");
    float_max();
    float_min();
    double_max();
    double_min();
    long_double_max();

    printf("\nFrom float.h\n\n");
    header_float_range();
	return 0;
}
Beispiel #7
0
collision_data get_collision_with_movable(movable_object *who, movable_object *with_whom){
    #define WHO_PLAYER ((movable_player*)who->object_data)
    #define WITH_PLAYER ((movable_player*)with_whom->object_data)
    #define WHO_PARTICLE ((movable_particle*)who->object_data)
    #define WITH_PARTICLE ((movable_particle*)with_whom->object_data)
    collision_data new_coll;
    new_coll.time = EMPTY_COLLISION_TIME;
    long double dr;
    switch(who->type){
        case motPLAYER:
            if(WHO_PLAYER->shield + WHO_PLAYER->shield_push > WHO_PLAYER->r0){
                dr = WHO_PLAYER->shield_push;
            }else{
                dr = 0;
            }
            switch(with_whom->type){
                case motPLAYER:
                    if(WITH_PLAYER->shield + WITH_PLAYER->shield_push > WITH_PLAYER->r0){
                        dr += WITH_PLAYER->shield_push;
                    }
                    new_coll.time = check_collision_between_two_balls(WITH_PLAYER->center.x - WHO_PLAYER->center.x,
                                                                      WITH_PLAYER->center.y - WHO_PLAYER->center.y,
                                                                      with_whom->dx - who->dx, with_whom->dy - who->dy,
                                                                      WHO_PLAYER->r + WITH_PLAYER->r, dr);
                    new_coll.time = double_min(new_coll.time, check_collision_between_two_balls(WITH_PLAYER->center.x - WHO_PLAYER->center.x,
                                                                      WITH_PLAYER->center.y - WHO_PLAYER->center.y,
                                                                      with_whom->dx - who->dx, with_whom->dy - who->dy,
                                                                      WHO_PLAYER->r0 + WITH_PLAYER->r0, 0));
                    break;
                case motPARTICLE:
                    new_coll.time = check_collision_between_two_balls(WITH_PARTICLE->center.x - WHO_PLAYER->center.x,
                                                                      WITH_PARTICLE->center.y - WHO_PLAYER->center.y,
                                                                      with_whom->dx - who->dx, with_whom->dy - who->dy,
                                                                      WITH_PARTICLE->r + WHO_PLAYER->r, dr);
                    new_coll.time = double_min(new_coll.time, check_collision_between_two_balls(WITH_PARTICLE->center.x - WHO_PLAYER->center.x,
                                                                      WITH_PARTICLE->center.y - WHO_PLAYER->center.y,
                                                                      with_whom->dx - who->dx, with_whom->dy - who->dy,
                                                                      WITH_PARTICLE->r + WHO_PLAYER->r0, 0));
                    break;
                default:
                    break;
            }
            break;
        case motPARTICLE:
            switch(with_whom->type){
                case motPLAYER:
                    if(WITH_PLAYER->shield + WITH_PLAYER->shield_push > WITH_PLAYER->r0){
                        dr = WITH_PLAYER->shield_push;
                    }else{
                        dr = 0;
                    }
                    new_coll.time = check_collision_between_two_balls(WITH_PLAYER->center.x - WHO_PARTICLE->center.x,
                                                                      WITH_PLAYER->center.y - WHO_PARTICLE->center.y,
                                                                      with_whom->dx - who->dx, with_whom->dy - who->dy,
                                                                      WITH_PLAYER->r + WHO_PARTICLE->r, dr);
                    new_coll.time = double_min(new_coll.time, check_collision_between_two_balls(WITH_PLAYER->center.x - WHO_PARTICLE->center.x,
                                                                      WITH_PLAYER->center.y - WHO_PARTICLE->center.y,
                                                                      with_whom->dx - who->dx, with_whom->dy - who->dy,
                                                                      WITH_PLAYER->r0 + WHO_PARTICLE->r, 0));
                    break;
                case motPARTICLE:
                    new_coll.time = check_collision_between_two_balls(WITH_PARTICLE->center.x - WHO_PARTICLE->center.x,
                                                                      WITH_PARTICLE->center.y - WHO_PARTICLE->center.y,
                                                                      with_whom->dx - who->dx, with_whom->dy - who->dy,
                                                                      WITH_PARTICLE->r + WHO_PARTICLE->r, 0);
                    break;
                default:
                    break;
            }
            break;
        default:
            break;
    }
    #undef WHO_PLAYER
    #undef WITH_PLAYER
    #undef WHO_PARTICLE
    #undef WITH_PARTICLE
    return new_coll;
}
Beispiel #8
0
collision_data get_collision_with_primitive(movable_object *who, primitive_object *with_what){
    #define WHO_PLAYER ((movable_player*)who->object_data)
    #define WHO_PARTICLE ((movable_particle*)who->object_data)
    #define WITH_POINT ((point*)with_what->object_data)
    #define WITH_SEGMENT ((segment*)(with_what->object_data))
    #define WITH_CIRCLE ((circle*)with_what->object_data)
    #define WITH_EXIT ((fixed_exit*)(((prim_exit*)with_what->object_data)->fixed_data))
    collision_data new_coll;
    long double dr;
    new_coll.time = EMPTY_COLLISION_TIME;
    new_coll.with_movable = false;
    switch(who->type){
        case motPLAYER:
            if(WHO_PLAYER->shield + WHO_PLAYER->shield_push > WHO_PLAYER->r0){
                dr = WHO_PLAYER->shield_push;
            }else{
                dr = 0;
            }
            switch(with_what->type){
                case potPOINT:
                    new_coll.time = check_collision_between_two_balls(WITH_POINT->x - WHO_PLAYER->center.x,
                                                                      WITH_POINT->y - WHO_PLAYER->center.y,
                                                                      who->dx, who->dy, WHO_PLAYER->r, dr);
                    new_coll.time = double_min(new_coll.time, check_collision_between_two_balls(WITH_POINT->x - WHO_PLAYER->center.x,
                                                                      WITH_POINT->y - WHO_PLAYER->center.y,
                                                                      who->dx, who->dy, WHO_PLAYER->r0, 0));
                    break;
                case potSEGMENT:
                    new_coll.time = check_collision_between_ball_and_segment(WHO_PLAYER->center.x, WHO_PLAYER->center.y,
                                                                             who->dx, who->dy, WHO_PLAYER->r, dr, WITH_SEGMENT);
                    new_coll.time = double_min(new_coll.time, check_collision_between_ball_and_segment(WHO_PLAYER->center.x, WHO_PLAYER->center.y,
                                                                             who->dx, who->dy, WHO_PLAYER->r0, 0, WITH_SEGMENT));
                    break;
                case potCIRCLE:
                    new_coll.time = check_collision_between_two_balls(WITH_CIRCLE->center.x - WHO_PLAYER->center.x,
                                                                      WITH_CIRCLE->center.y - WHO_PLAYER->center.y,
                                                                      who->dx, who->dy, WHO_PLAYER->r + WITH_CIRCLE->r, dr);
                    new_coll.time = double_min(new_coll.time, check_collision_between_two_balls(WITH_CIRCLE->center.x - WHO_PLAYER->center.x,
                                                                      WITH_CIRCLE->center.y - WHO_PLAYER->center.y,
                                                                      who->dx, who->dy, WHO_PLAYER->r0 + WITH_CIRCLE->r, 0));
                    break;
                case potEXIT:
                    if(!((prim_exit*)with_what->object_data)->done){
                        new_coll.time = check_exit(WITH_EXIT->center.x - WHO_PLAYER->center.x,
                                                   WITH_EXIT->center.y - WHO_PLAYER->center.y,
                                                   WITH_EXIT);
                    }
                    break;
            }
            break;
        case motPARTICLE:
            switch(with_what->type){
                case potPOINT:
                    new_coll.time = check_collision_between_two_balls(WITH_POINT->x - WHO_PARTICLE->center.x,
                                                                      WITH_POINT->y - WHO_PARTICLE->center.y,
                                                                      who->dx, who->dy, WHO_PARTICLE->r, 0);
                    break;
                case potSEGMENT:
                    new_coll.time = check_collision_between_ball_and_segment(WHO_PARTICLE->center.x, WHO_PARTICLE->center.y,
                                                                             who->dx, who->dy, WHO_PARTICLE->r, 0, WITH_SEGMENT);
                    break;
                case potCIRCLE:
                    new_coll.time = check_collision_between_two_balls(WITH_CIRCLE->center.x - WHO_PARTICLE->center.x,
                                                                      WITH_CIRCLE->center.y - WHO_PARTICLE->center.y,
                                                                      who->dx, who->dy, WHO_PARTICLE->r + WITH_CIRCLE->r, 0);
                    break;
                default:
                    ;
            }
            break;
        default:
            break;
    }
    #undef WHO_PLAYER
    #undef WHO_PARTICLE
    #undef WITH_POINT
    #undef WITH_SEGMENT
    #undef WITH_CIRCLE
    #undef WITH_EXIT
    return new_coll;
}