!lymvtcwDJ7ZA9Npq:lix.systems

Lix Development

413 Members
(Technical) development of Lix, the package manager, a Nix implementation. Please be mindful of ongoing technical conversations in this channel.139 Servers

Load older messages


SenderMessageTime
14 Aug 2025
@emilazy:matrix.orgemily

the latest RFC defines a single numeric type and says

This specification allows implementations to set limits on the range
and precision of numbers accepted. Since software that implements
IEEE 754 binary64 (double precision) numbers [IEEE754] is generally
available and widely used, good interoperability can be achieved by
implementations that expect no more precision or range than these
provide, in the sense that implementations will approximate JSON
numbers within the expected precision. A JSON number such as 1E400
or 3.141592653589793238462643383279 may indicate potential
interoperability problems, since it suggests that the software that
created it expects receiving software to have greater capabilities
for numeric magnitude and precision than is widely available.

Note that when such software is used, numbers that are integers and
are in the range [-(253)+1, (253)-1] are interoperable in the
sense that implementations will agree exactly on their numeric
values.

15:37:10
@emilazy:matrix.orgemily *

the latest RFC defines a single numeric type and says

   This specification allows implementations to set limits on the range
   and precision of numbers accepted.  Since software that implements
   IEEE 754 binary64 (double precision) numbers [IEEE754] is generally
   available and widely used, good interoperability can be achieved by
   implementations that expect no more precision or range than these
   provide, in the sense that implementations will approximate JSON
   numbers within the expected precision.  A JSON number such as 1E400
   or 3.141592653589793238462643383279 may indicate potential
   interoperability problems, since it suggests that the software that
   created it expects receiving software to have greater capabilities
   for numeric magnitude and precision than is widely available.

   Note that when such software is used, numbers that are integers and
   are in the range [-(2**53)+1, (2**53)-1] are interoperable in the
   sense that implementations will agree exactly on their numeric
   values.
15:37:16
@emilazy:matrix.orgemilythere is an RFC that subsets it into an interoperable subset that IIRC they say that IETF specifications SHOULD use; I believe it limits the range to the interoperable subset15:37:39
@emilazy:matrix.orgemilybut I'd have to check15:37:42
@emilazy:matrix.orgemily Nix could just always parse numeric literals in JSON into floats, but it would be annoying. (especially since Nixpkgs backs its integer-parsing functions by fromJSON) 15:38:05
@weethet:catgirl.cloudWeetHet
In reply to @raitobezarius:matrix.org
In ~ 5 days, yeah
Thanks
15:38:15
@emilazy:matrix.orgemily

ok, I-JSON says

   Software that implements IEEE 754-2008 binary64 (double precision)
   numbers [IEEE754] is generally available and widely used.
   Implementations that generate I-JSON messages cannot assume that
   receiving implementations can process numeric values with greater
   magnitude or precision than provided by those numbers.  I-JSON
   messages SHOULD NOT include numbers that express greater magnitude or
   precision than an IEEE 754 double precision number provides, for
   example, 1E400 or 3.141592653589793238462643383279.

   An I-JSON sender cannot expect a receiver to treat an integer whose
   absolute value is greater than 9007199254740991 (i.e., that is
   outside the range [-(2**53)+1, (2**53)-1]) as an exact value.

   For applications that require the exact interchange of numbers with
   greater magnitude or precision, it is RECOMMENDED to encode them in
   JSON string values.  This requires that the receiving program
   understand the intended semantic of the value.  An example would be
   64-bit integers, even though modern hardware can deal with them,
   because of the limited scope of JavaScript numbers.
15:38:53
@emilazy:matrix.orgemilyok, Nixpkgs does in fact detect the float case for integer conversions15:39:36
@emilazy:matrix.orgemilyso "fits into Nix integer → Nix integer, otherwise → float" would be desirable for Nixpkgs and consistent with other JSON implementations15:39:58
@emilazy:matrix.orgemily"fits into Nix integer → Nix integer, otherwise → error" would be acceptable for that too, but less interoperable with other JSON implementations and weird per the spec15:40:28
@emilazy:matrix.orgemily since adding a .0 isn't really meant to change a number by the specced JSON semantics 15:40:39
@emilazy:matrix.orgemily and indeed builtins.fromJSON "1.0" is 1 15:40:50
@emilazy:matrix.orgemily oh wait 1.0 also prints as 1 15:41:01
@emilazy:matrix.orgemily
nix-repl> builtins.isInt (builtins.fromJSON "1.0")
false

ok never mind :)

15:41:12
@emilazy:matrix.orgemilyanyway my point is just that we should pick one. the current behaviour is incoherent15:41:27
@aloisw:julia0815.dealoiswApparently that behaviour even changed, I remember it throwing or converting to float depending on the number of digits but now the float only happens when out of the unsigned range.16:27:10
@emilazy:matrix.orgemilyyes16:42:22
@emilazy:matrix.orgemilyit was changed when banning overflow in the Nix language16:42:25
@emilazy:matrix.orgemilyIMO that part of the change was a mistake16:42:31
@emilazy:matrix.orgemilywell, it would be just a difference of opinion if the negative values were handled consistently16:42:44
@jade_:matrix.orgjade_ i don't know what it should do 16:44:22
@jade_:matrix.orgjade_i chose to make it behave conservatively16:44:40
@emilazy:matrix.orgemily builtins.fromJSON "-9223372036854775809"'s behaviour is not conservative though 16:46:56
@emilazy:matrix.orgemilysee16:47:06
@emilazy:matrix.orgemilyJSON has only one numeric type and we certainly want everything that fits in a Nix integer to be represented as one (because Nixpkgs expects that). so the two options are optimistically coercing JSON literals that look like Nix integers into Nix integers and leaving the rest as floats, or coercing JSON literals that look like any kind of integer into Nix integers, leaving ones that are clearly floats as floats, and rejecting the rest. currently, we do neither16:48:52
@jade_:matrix.orgjade_correct, I would class that as "a bug"16:49:20
@emilazy:matrix.orgemily I think the former is what makes the most sense per JSON semantics and the general behaviour pointed at by the RFCs. the latter is defensible too. but picking one for positive values and another for negative values because of how nlohmann_json interacts with C++ numeric types not so much 16:49:22
@emilazy:matrix.orgemilyok. but I think it is hard to define these erroring semantics in a way that doesn't have weird edge cases wrt how JSON works16:50:09
@jade_:matrix.orgjade_ I think that getting a float in nix in general because it's nix is usually an undesired outcome 16:50:14
@emilazy:matrix.orgemilyfor instance, there are also JSOn literal floats that cannot be represented16:50:22

Show newer messages


Back to Room ListRoom Version: 10