Thread overview
Float swap using bswap produces different values
Oct 14
vinoB
Oct 14
user1234
Oct 14
user1234
October 14

Hi All,

Request your help in understanding why the below code is producing different outputs, code 1 output: 4294966806, code 2/3 output: 50331648, and which one is the correct output.

import std.stdio;

auto floatswap(T)(T[] array) @trusted @nogc pure nothrow
{
    foreach (ref item; array)
    {
        import core.bitop : bswap;
        // Code 1 output: 4294966806
        const swapped1 = bswap(*cast(uint*)&item);
        item = *cast(const(T)*)&swapped1;
        return cast(uint) item;

        // Code 2 output: 50331648
        uint tmp = cast(uint) item;
        tmp = bswap(tmp);
        uint swapped2 = cast(float) tmp;
        return swapped2;

        // Code 3 output: 50331648
        return bswap(cast(uint) item);
     }
    return assert(false, "Unsupported T: " ~ T.stringof);
}

void main () {
    float[1] floatswapBuffer = [3.14f];
    writeln(floatswap(floatswapBuffer[]));
}
October 14

On Monday, 14 October 2024 at 15:59:07 UTC, vinoB wrote:

>

Hi All,

Request your help in understanding why the below code is producing different outputs, code 1 output: 4294966806, code 2/3 output: 50331648, and which one is the correct output.

[...]

cast(unint) of a float does truncation. So none of your version is correct.
See https://dlang.org/spec/expression.html#cast_floating, paragraph 2.

October 14

On Monday, 14 October 2024 at 20:38:38 UTC, user1234 wrote:

>

On Monday, 14 October 2024 at 15:59:07 UTC, vinoB wrote:

>

Hi All,

Request your help in understanding why the below code is producing different outputs, code 1 output: 4294966806, code 2/3 output: 50331648, and which one is the correct output.

[...]

cast(unint) of a float does truncation. So none of your version is correct.
See https://dlang.org/spec/expression.html#cast_floating, paragraph 2.

Well "Code 1" does the right thing expected for the cast on the return which wastes it.