c3c icon indicating copy to clipboard operation
c3c copied to clipboard

`io::printf*` prints int128/uint128 incorrectly

Open data-man opened this issue 3 years ago • 5 comments

import std::io;

fn void main()
{
    ushort u1 = 1;
    uint128 u128 = 2;

    long i1 = 1;
    int128 i128 = 2;

    io::printfln("$$PLATFORM_I128_SUPPORTED = %s", $$PLATFORM_I128_SUPPORTED);
    io::printfln("u1 = %s", u1);
    io::printfln("u128 = %s", u128);

    io::printfln("i1 = %s", i1);
    io::printfln("i128 = %s", i128);

}
$$PLATFORM_I128_SUPPORTED = false
u1 = 1
u128 = 0
i1 = 1
i128 = 0

data-man avatar Sep 11 '22 09:09 data-man

Quick dirty(?) fix:

diff --git a/lib/std/io_printf.c3 b/lib/std/io_printf.c3
index bc0b642..757d390 100644
--- a/lib/std/io_printf.c3
+++ b/lib/std/io_printf.c3
@@ -334,7 +334,7 @@ private fn void! ntoa_format(PrintParam* param, char[] buf, usize len, bool nega
        return param.out_reverse(buf[:len]);
 }

-$if (env::I128_SUPPORT):
+$if (!env::I128_SUPPORT):
 define NtoaType = uint128;
 $else:
 define NtoaType = ulong;

data-man avatar Sep 11 '22 13:09 data-man

I wonder whether this works. I deliberately waited to fix full i128 support.

lerno avatar Sep 12 '22 14:09 lerno

I wonder whether this works.

Yes, I checked with all numeric types (for linux-x64).

data-man avatar Sep 13 '22 05:09 data-man

Wait, your change is that you turn on the I128 when it isn't supported?

lerno avatar Sep 14 '22 21:09 lerno

Yes.

import std::io;
import libc;

fn void main()
{
    ushort u1 = 1;
    uint128 u128 = 2;

    long i1 = 1;
    int128 i128 = -2;

    float f1 = 1.23456789;
    double d1 = -0.123456789;

    io::printfln("$$PLATFORM_I128_SUPPORTED = %s", $$PLATFORM_I128_SUPPORTED);
    io::printfln("u1 = %s", u1);
    io::printfln("u128 = %s", u128);
    io::printfln("uint128.min = %s", uint128.min);
    io::printfln("uint128.max = %s", uint128.max);

    io::printfln("i1 = %s", i1);
    io::printfln("i128 = %s", i128);
    io::printfln("int128.min = %s", int128.min);
    io::printfln("int128.max = %s", int128.max);

    io::printfln("int.min = %s", int.min);
    io::printfln("int.max = %s", int.max);

    io::printfln("float.min = %s", float.min);
    io::printfln("float.max = %s", float.max);
}
$$PLATFORM_I128_SUPPORTED = false
u1 = 1
u128 = 2
uint128.min = 0
uint128.max = 340282366920938463463374607431768211455
i1 = 1
i128 = -2
int128.min = -170141183460469231731687303715884105728
int128.max = 170141183460469231731687303715884105727
int.min = -340282366920938463463374607429620727808
int.max = 2147483647
float.min = 0.000000
float.max = 3.402823e+38

data-man avatar Sep 14 '22 21:09 data-man

Should work fine now.

lerno avatar Oct 20 '22 16:10 lerno

Please close if it works for you @data-man

lerno avatar Oct 21 '22 09:10 lerno

Thank you!

data-man avatar Oct 22 '22 14:10 data-man