Hi all, I don't know if it's the correct way to do it or if there is a better way, but i'm using
var result = (double) (value & 0x7fffffffffffffffL ); if (value < 0) { result = result + 9.223372036854776E18; } The idea is to mask the sign bit, do the conversion to double and if the sign bit was present (if value < 0) add Long.MAX_VALUE + 1 (9223372036854775808) as a double. I've got 9.223372036854776E18 as the result of BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.ONE).doubleValue() Rémi > From: "David Lloyd" <david.ll...@redhat.com> > To: "Johannes Kuhn" <i...@j-kuhn.de> > Cc: "core-libs-dev" <core-libs-...@openjdk.java.net> > Sent: Friday, November 11, 2022 3:38:31 PM > Subject: Re: Unsigned long to double and back > Well, I typed this out from memory so there's an error, of course. `(tmp & 1)` > should be `(input & 1)`. > On Fri, Nov 11, 2022 at 8:31 AM David Lloyd < [ mailto:david.ll...@redhat.com > | > david.ll...@redhat.com ] > wrote: >> I encountered this issue as well; for now I'm using the following >> transformation: >> long tmp = input >>> 1; >> double output = ((double) tmp) * 2.0 + (tmp & 1); >> I... *think* it's correct but I'm not 100% sure and have a long-standing >> TODO to >> try and figure it out... >> On Sat, Nov 5, 2022 at 7:17 PM Johannes Kuhn < [ mailto:i...@j-kuhn.de | >> i...@j-kuhn.de ] > wrote: >>> When I tried to implement an WASM transpiler, I noticed some missing >>> conversion methods from unsigned types to floating point, for example >>> from unsigned long to a double. >>> For the meaning of unsigned long, see Long.toUnsignedString(long i). >>> Converting between unsigned long and floating point is not a trivial >>> task, as it probably requires some bit manipulation. >>> In particular, I would love to see the following methods added*: >>> - double Double.fromUnsignedLong(long i) >>> - long Double.toUnsignedLong(double d) >>> - float Float.fromUnsignedLong(long i) >>> - long Float.toUnsignedLong(float f) >>> * Subject to bikeshedding - I don't care about the name, or if it is >>> added to the Long class. >>> Currently, I don't think that additional methods for unsigned int are >>> necessary - as it is possible to cast between long and int, but feel >>> free to correct me. >>> In WASM, the specification for those methods can be found here: >>> [ https://www.w3.org/TR/wasm-core-1/#op-trunc-u | >>> https://www.w3.org/TR/wasm-core-1/#op-trunc-u ] >>> [ https://www.w3.org/TR/wasm-core-1/#op-convert-u | >>> https://www.w3.org/TR/wasm-core-1/#op-convert-u ] >>> Note that the WASM specification is undefined for some values, notably >>> NaN, infinities, and values that fall out of the range. >>> As *I* want to use it to implement WASM instructions, I do not have any >>> strong opinion on the undefined cases - for example, returning the >>> nearest unsigned long value or throwing an exception is fine for me. >>> What do you think? >>> - Johannes >> -- >> - DML • he/him > -- > - DML • he/him