Esempio n. 1
0
void gsb_real_cunit__gsb_real_mul( void )
{
    GsbReal a = { 12, 1 };
    GsbReal b = { 31415, 4 };
    GsbReal r = gsb_real_mul ( a, b );
    CU_ASSERT_EQUAL ( 37698, r.mantissa );
    CU_ASSERT_EQUAL ( 4, r.exponent );

    a.mantissa = 0x7FFFFFFF;
    a.exponent = 0;
    b.mantissa = 2;
    b.exponent = 0;
    r = gsb_real_mul ( a, b );
    CU_ASSERT_EQUAL ( G_GINT64_CONSTANT(4294967294), r.mantissa );
    CU_ASSERT_EQUAL ( 0, r.exponent );

    a.mantissa = 0x7FFFFFFF;
    a.exponent = 0;
    b.mantissa = 9;
    b.exponent = 1;
    r = gsb_real_mul ( a, b );
    CU_ASSERT_EQUAL ( 19327352823, r.mantissa );
    CU_ASSERT_EQUAL ( 1, r.exponent );

    a.mantissa = G_MININT64;
    a.exponent = 0;
    b.mantissa = 2;
    b.exponent = 0;
    r = gsb_real_mul ( a, b );
    CU_ASSERT_EQUAL ( G_MININT64, r.mantissa );
    CU_ASSERT_EQUAL ( 0, r.exponent );

    a.mantissa = 100;
    a.exponent = 0;
    b.mantissa = G_MININT64;
    b.exponent = 0;
    r = gsb_real_mul(a, b);
    CU_ASSERT_EQUAL ( G_MININT64, r.mantissa );
    CU_ASSERT_EQUAL ( 0, r.exponent );

    a.mantissa = 22000;
    a.exponent = 0;
    b.mantissa = 100000;
    b.exponent = 0;
    r = gsb_real_mul ( a, b );
    CU_ASSERT_EQUAL ( G_GINT64_CONSTANT(2200000000), r.mantissa );
    CU_ASSERT_EQUAL ( 0, r.exponent );

    a.mantissa = -22000;
    a.exponent = 0;
    b.mantissa = 100000;
    b.exponent = 0;
    r = gsb_real_mul ( a, b );
    CU_ASSERT_EQUAL ( G_GINT64_CONSTANT(-2200000000), r.mantissa );
    CU_ASSERT_EQUAL ( 0, r.exponent );
}
Esempio n. 2
0
/**
 * calcule le total du contenu de l'entrée donnée en argument
 * accepte les + et les - * /
 *
 * \param entry         entrée d'un montant
 *
 * \return gsb_real     total de ce qui est dans l'entrée
 */
gsb_real utils_real_get_calculate_entry ( GtkWidget *entry )
{
    gchar *string;
    gchar *pointeur;
    gsb_real total = null_real;

    string = my_strdup ( gtk_entry_get_text ( GTK_ENTRY ( entry ) ) );

    if ( string && strlen ( string ) )
        pointeur = string + strlen ( string );
    else
    {
        if ( string )
            g_free ( string );
        return total;
    }

    if ( g_utf8_strchr ( string, -1, '-' ) || g_utf8_strchr ( string, -1, '+' ) )
    {
        while ( pointeur != string )
        {
            if ( pointeur[0] == '+'
                 ||
                 pointeur[0] == '-' )
            {
                total = gsb_real_add ( total,
                            utils_real_get_from_string ( pointeur ) );
                pointeur[0] = 0;
            }

            pointeur--;
        }
        total = gsb_real_add ( total,
                        utils_real_get_from_string ( pointeur ) );
    }
    else if ( g_utf8_strchr ( string, -1, '*' ) )
    {
        total.mantissa = 1;
        total.exponent = 0;

        while ( pointeur != string )
        {
            if ( pointeur[0] == '*' )
            {
                total = gsb_real_mul ( total,
                            utils_real_get_from_string ( pointeur + 1 ) );
                pointeur[0] = 0;
            }

            pointeur--;
        }
        total = gsb_real_mul ( total,
                        utils_real_get_from_string ( pointeur ) );
    }
    else if ( g_utf8_strchr ( string, -1, '/' ) )
    {
        gchar **tab;

        tab = g_strsplit ( string, "/", 2 );

        total = gsb_real_div ( utils_real_get_from_string ( tab[0] ),
                        utils_real_get_from_string ( tab[1] ) );

        g_strfreev ( tab );
    }
    else
        total = utils_real_get_from_string ( string );

    g_free ( string );

    return total;
}