Thread overview
Which function returns a pair after division ? (integer,frac)
Sep 19
Ki Rill
Sep 19
claptrap
September 19

What D function or D operator does this?

IDIV EAX, r/m32
IDIV 5, 2
 EAX = 2
 EDX = 1

and returns (2,1) at once?

September 19

On Tuesday, 19 September 2023 at 03:44:18 UTC, Vitaliy Fadeev wrote:

>

What D function or D operator does this?

IDIV EAX, r/m32
IDIV 5, 2
 EAX = 2
 EDX = 1

and returns (2,1) at once?

You can either use function out parameters with return value or tuples:

import std.typecons;

// with tuples
auto getVal(int a, int b) {
    // ...
    return tuple(integer, frac);
}

// out params
int getVal2(int a, int b, out int frac) {
    // ...

    frac = _fraq;
    return integer;
}

// USAGE
{
    // with tuples
    auto v = getVal(5, 2);
    assert(v[0] == 2);
    assert(v[1] == 1);

    // with out params
    int frac;
    int integer = getVal2(5, 2, frac);
    assert(integer == 2);
    assert(frac == 1);
}

September 19
There are no operators for this, not that you need one.

```d
void func(int numerator, int denominator, out int quotient, out int remainder) {
    quotient = numerator / denominator;
    remainder = numerator % denominator;
}
```

This will produce with ldc2 -O3:

```
void example.func(int, int, out int, out int):
        mov     r8, rdx
        mov     eax, edi
        cdq
        idiv    esi
        mov     dword ptr [r8], eax
        mov     dword ptr [rcx], edx
        ret
```

Embrace modern backends, they are amazing!
September 19
On Tuesday, 19 September 2023 at 03:53:06 UTC, Richard (Rikki) Andrew Cattermole wrote:
> There are no operators for this, not that you need one.
>
> ```d
> void func(int numerator, int denominator, out int quotient, out int remainder) {
>     quotient = numerator / denominator;
>     remainder = numerator % denominator;
> }
> ```
>
> This will produce with ldc2 -O3:
>
> ```
> void example.func(int, int, out int, out int):
>         mov     r8, rdx
>         mov     eax, edi
>         cdq
>         idiv    esi
>         mov     dword ptr [r8], eax
>         mov     dword ptr [rcx], edx
>         ret
> ```
>
> Embrace modern backends, they are amazing!

Thanks, Rikki. Optimization is good!
May be exist native D function or D-operator, like ```(a,b) = x /% y;``` ?

September 19

On Tuesday, 19 September 2023 at 03:44:18 UTC, Vitaliy Fadeev wrote:

>

What D function or D operator does this?

IDIV EAX, r/m32
IDIV 5, 2
 EAX = 2
 EDX = 1

and returns (2,1) at once?

If you use LDC it'll automatically optimize that for you

https://d.godbolt.org/z/oz4h9ccbP