Skip to content

FloatMul

Description

Generic multiplication convenience macro for Float.

Parameters

Name Direction Description
result out Destination for the product
a in Left operand
b in Right operand selected through generic dispatch

Usage example (from documentation)

  FloatMul(&product, &value, 0.5f);

Success

Returns true; *result holds a * b with the exponents summed and the significand normalized.

Failure

Returns false if an intermediate allocation (significand multiply / normalize) fails; *result is unchanged.

Usage example (Cross-references)

Usage examples (Cross-references)
        Float r    = FloatInit(&alloc.base);
    
        bool ok = FloatMul(&r, &zero, &big);
        ok      = ok && FloatIsZero(&r);
        ok      = ok && (FloatExponent(&r) == 0);
    
    bool test_float_mul_small_small(void) {
        WriteFmt("Testing FloatMul with small floats\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        Str   text         = StrInit(&alloc.base);
    
        FloatMul(&result_value, &a, &b);
        text = FloatToStr(&result_value);
    
    bool test_float_mul_very_large_small(void) {
        WriteFmt("Testing FloatMul with very large and small floats\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        Str   text         = StrInit(&alloc.base);
    
        FloatMul(&result_value, &a, &b);
        text = FloatToStr(&result_value);
    
    bool test_float_mul_generic(void) {
        WriteFmt("Testing FloatMul generic dispatch\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        Str   text         = StrInit(&alloc.base);
    
        FloatMul(&result_value, &a, &b);
        text        = FloatToStr(&result_value);
        bool result = ZstrCompare(StrBegin(&text), "3") == 0;
    
        StrDeinit(&text);
        FloatMul(&result_value, &a, &whole);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "3") == 0);
    
        StrDeinit(&text);
        FloatMul(&result_value, &a, 2u);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "3") == 0);
    
        StrDeinit(&text);
        FloatMul(&result_value, &a, -2);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "-3") == 0);
    
        StrDeinit(&text);
        FloatMul(&result_value, &a, 0.5f);
        text   = FloatToStr(&result_value);
        result = result && (ZstrCompare(StrBegin(&text), "0.75") == 0);
    // gt_to_ge mutant the guard fires LOG_FATAL and the process aborts -> killed.
    static bool test_m10_mul_exp_max_boundary(void) {
        WriteFmt("Testing exponent-sum at INT64_MAX boundary (FloatMul)\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        Float r = FloatInit(&alloc.base);
    
        bool ok = FloatMul(&r, &a, &b);
        ok      = ok && (FloatExponent(&r) == INT64_MAX);
    // lt_to_le mutant aborts -> killed.
    static bool test_m10_mul_exp_min_boundary(void) {
        WriteFmt("Testing exponent-sum at INT64_MIN boundary (FloatMul)\n");
    
        DefaultAllocator alloc = DefaultAllocatorInit();
        Float r = FloatInit(&alloc.base);
    
        bool ok = FloatMul(&r, &a, &b);
        ok      = ok && (FloatExponent(&r) == INT64_MIN);
        Float r = FloatFromStr("314159265", &dbg.base); // pre-populated dest
    
        bool ok = FloatMul(&r, &a, &b);
    
        FloatDeinit(&a);
        Int            b   = IntFrom(4, &dbg.base);
    
        bool ok = FloatMul(&r, &a, &b);
    
        FloatDeinit(&a);
        Float          r   = FloatInit(&dbg.base);
    
        bool ok = FloatMul(&r, &a, 4u);
    
        FloatDeinit(&a);
        Float          r   = FloatInit(&dbg.base);
    
        bool ok = FloatMul(&r, &a, -4);
    
        FloatDeinit(&a);
        Float          r   = FloatInit(&dbg.base);
    
        bool ok = FloatMul(&r, &a, 0.5f);
    
        FloatDeinit(&a);
        Float          r   = FloatInit(&dbg.base);
    
        bool ok = FloatMul(&r, &a, 0.25);
    
        FloatDeinit(&a);
        Float canon   = FloatFromStr("0", &alloc.base);
    
        bool ok = FloatMul(&product, &zero, &neg);
        ok      = ok && FloatIsZero(&product);
Last updated on