On Friday, 22 August 2014 at 20:02:41 UTC, Sönke Ludwig wrote:
Am 22.08.2014 21:48, schrieb Christian Manning:
On Friday, 22 August 2014 at 17:45:03 UTC, Sönke Ludwig wrote:
Am 22.08.2014 19:27, schrieb "Marc Schütz" <schue...@gmx.net>":
On Friday, 22 August 2014 at 16:56:26 UTC, Sönke Ludwig wrote:
Am 22.08.2014 18:31, schrieb Christian Manning:
It would be nice to have integers treated separately to doubles. I
know
it makes the number parsing simpler to just treat everything as
double,
but still, it could be annoying when you expect an integer type.

That's how I've done it for vibe.data.json, too. For the new
implementation, I've just used the number parsing routine from Andrei's std.jgrandson module. Does anybody have reservations about
representing integers as "long" instead?

It should automatically fall back to double on overflow. Maybe even use
BigInt if applicable?

I guess BigInt + exponent would be the only lossless way to represent any JSON number. That could then be converted to any desired smaller
type as required.

But checking for overflow during number parsing would definitely have an impact on parsing speed, as well as using a BigInt of course, so the question is how we want set up the trade off here (or if there is
another way that is overhead-free).

You could check for a decimal point and a 0 at the front (excluding possible - sign), either would indicate a double, making the reasonable
assumption that anything else will fit in a long.

Yes, no decimal point + no exponent would work without overhead to detect integers, but that wouldn't solve the proposed automatic long->double overflow, which is what I meant. My current idea is to default to double and optionally support any of long, BigInt and "Decimal" (BigInt+exponent), where integer overflow only works for long->BigInt.

It might be the right choice anyway (seeing as json/js do overflow to double), but fwiw it's still atrocious.

double a = long.max;
assert(iota(1, 1000000).map!(d => (a+d)-a).until!"a != 0".walkLength == 1024);

Yuk.

Floating point numbers and integers are so completely different in behaviour that it's just dishonest to transparently switch between the two. This especially the case for overflow from long -> double, where by definition you're 10 bits past being able to reliably accurately represent the integer in question.

Reply via email to