comp.lang.ada
 help / color / mirror / Atom feed
From: "Björn Lundin" <b.f.lundin@gmail.com>
Subject: Re: Fixed vs float and precision and conversions
Date: Wed, 8 Jul 2020 10:15:39 +0200	[thread overview]
Message-ID: <re3vbb$kca$1@dont-email.me> (raw)
In-Reply-To: <756885db-118a-4d76-b90d-e547a3cabf28o@googlegroups.com>

Den 2020-07-07 kl. 23:58, skrev Shark8:
> On Tuesday, July 7, 2020 at 3:10:22 PM UTC-6, björn lundin wrote:
>>
>> I have a fixed type
>>     type Fixed_Type is delta 0.001 digits 18;
>>
>> but JSON does not support that. So I get floats instead.
> This is a limitation of JSON, IIUC: all numeric are IEE754 floats -- see: https://www.json.org/json-en.html

Yes.

> 
> If you have access to both sides of the serialization, you could define an intermediate serialization say a string of "Fixed_Type#value#" where 'value' is the string-representation you need. -- You can extract the value by indexing on the '#' characters, extracting the portion in between, and feeding that via Fixed_Type'Value( EXTRACTED_SUBSTRING ), and produce it via "Fixed_Type#" & Fixed_Type'Image( fp_value ) & '#'.

Interesting - but for another project.
Here, I do not own the other side.

Perhaps I should have stated that the other side is Betfair, and in this 
case I get odds of horse races via their API.
The only valid odds are in a fixed set of numbers like

they have small increments in the beginning, which increase as the odds 
go up
like this partial array shows where
   type Tics_Type is new integer range 1 .. 350;

Global_Odds_Table : array(Tics_Type'Range) of Fixed_Type := (
1.01,   1.02,   1.03,   1.04,   1.05,
...
2.00,   2.02,   2.04,   2.06,   2.08,   2.10,
...
3.00,   3.05,   3.10,   3.15,   3.20,   3.25,
...
4.00,   4.10,   4.20,   4.30,   4.40,   4.50,
...
5.00,   5.10,   5.20,   5.30,   5.40,   5.50,
...
10.00,  10.50,  11.00,  11.50,  12.00,  12.50,
...
20.00,  21.00,  22.00,  23.00,  24.00,  25.00,
...
50.00,  55.00,  60.00,  65.00,  70.00,  75.00,
...
100.00, 110.00, 120.00, 130.00, 140.00, 150.00,
...
960.00, 970.00, 980.00, 990.00,1000.00);


so I get 5.1 from the JSON, which is occasionaly converted to 5.099, 
which I have trouble to find in the array above.
I am now thinking of traversing it and make an absolute diff like 
abs(myval - arrayval) and pick the one with smallest diff.

But my idea of using fixed was to escape the rounding errors.
But hmm, here it is about feeding data _into_ the system, and here I'll 
get the error, while the rest will work nice.

Hmm, I need to do some testing

Thanks for the reply


-- 
Björn

  reply	other threads:[~2020-07-08  8:15 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-07 21:10 Fixed vs float and precision and conversions Björn Lundin
2020-07-07 21:30 ` Niklas Holsti
2020-07-08  8:17   ` Björn Lundin
2020-07-07 21:58 ` Shark8
2020-07-08  8:15   ` Björn Lundin [this message]
2020-07-08 16:16     ` Shark8
2020-07-08 18:08       ` Björn Lundin
2020-07-08 18:10         ` Björn Lundin
2020-07-08 18:21           ` Niklas Holsti
2020-07-08 19:39             ` Björn Lundin
2020-07-08 20:34               ` Niklas Holsti
2020-07-08 21:24                 ` Björn Lundin
2020-07-09  7:11                   ` Niklas Holsti
2020-07-08 18:36           ` Dmitry A. Kazakov
2020-07-08 19:41             ` Björn Lundin
2020-07-09  6:20               ` Dmitry A. Kazakov
2020-07-09  7:23                 ` Björn Lundin
2020-07-09  7:49                   ` Dmitry A. Kazakov
2020-07-08 21:16         ` Shark8
2020-07-08 21:47           ` Björn Lundin
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox