On 11/21/2016 11:16 AM, Kagamin wrote:
Can't find a function for it.

Here is a draft adapted from the following page


http://stackoverflow.com/questions/14872499/is-there-an-equivalent-to-muldiv-for-linux

This draft works for signed types:

T mulDiv(T)(T number, T numerator, T denominator) {
    static if (is (T == long)) {
        static assert("Sorry, can't support long");
    }
    else static if (is (T == int)) {
        alias InterimT = long;
    }
    else {
        alias InterimT = int;
    }

    InterimT ret = number;
    ret *= numerator;
    ret /= denominator;
    return cast(T)ret;
}

void main() {
    int number = int.max / 2;
    int numerator = 42;
    int denominator = numerator * 2;

    const correctResult = int.max / 4;
    const wrongResult = number * numerator / denominator;

    assert(mulDiv(number, numerator, denominator) == correctResult);
    assert(wrongResult != correctResult);
}

Ali

Reply via email to