comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: How to put 200 into an integer sub-type of 16 bits (code included)
Date: Thu, 15 Jan 2009 16:54:43 +0100
Date: 2009-01-15T16:54:48+01:00	[thread overview]
Message-ID: <i80reerp9dye$.cca2j4pgzm77.dlg@40tude.net> (raw)
In-Reply-To: 86ab9s7jlx.fsf@stephe-leake.org

On Thu, 15 Jan 2009 09:02:34 -0500, Stephen Leake wrote:

> ChristopherL <clusardi2k@aol.com> writes:
> 
>> On Jan 14, 12:41�pm, Adam Beneschan <a...@irvine.com> wrote:
>>> On Jan 14, 12:13 pm, ChristopherL <clusard...@aol.com> wrote:
>>>
>>> > I want to copy bits from an Ada float to a user defined short integer
>>> > maintaining the same
>>> > bit representation.
>>
>> This problem was given to me to try to solve who said it's probably
>> impossible!
> 
> Ok. This could eventually be used to verify the floating point format
> used by your machine, for example.
>
> The right way to proceed is to write a bit-level record clause for the
> floating point type on your hardware; something like:
> 
> type unsigned_24 is ...;
> type usigned_7 is ...;
> 
> type IEEE_32_Float_Rep_Type is record
>     sign : boolean;
>     exponent : unsigned_7;
>     mantissa_1 : Interfaces.unsigned_8;
>     mantissa_2 : Interfaces.unsigned_8;
>     mantissa_3 : Interfaces.unsigned_8;
> end record;
> 
> for IEEE_32_Float_Rep_Type use record
>     sign : at 0 range 0 .. 0;
>     exponent : at 0 range 1 .. 8;
>     mantissa_1 : at 0 range 9 .. 15;
>     mantissa_2 : at 0 range 16 .. 23;
>     mantissa_3 : at 0 range 24 .. 31;
> end record;
> 
> Note that I broke the mantissa down into three parts, each fitting in
> 8 bits.
> 
> I probably have the details wrong for IEEE 32 bit float; look it up
> somewhere.

Well, it is not that simple, because there are special patterns for ideals
like NaN and also denormalized representations. Also there is an issue of
octet endianness.

Anyway here is an implementation that handles IEEE 754 representations:

http://www.dmitry-kazakov.de/ada/components.htm#IEEE_754

> Especially note that the 'range' values need to have the correct
> endianness for your machine (sign will be at 31 on some machines, 0 on
> others).

Or even somewhere in the middle, provided that the machine numbers are
indeed IEEE... (:-))

> Then use unchecked conversion from float to IEEE_32_Float_Rep_type,
> then simple assignment (possibly with an integer type conversion) from
> any field to an Unsigned_8.

Well, that is IMO a different task, and there are floating point attributes
like S'Exponent and S'Fraction for this, which do the job properly.

I am afraid that the OP's question does not make any sense. It looks like a
C-ism...

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de



  reply	other threads:[~2009-01-15 15:54 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <407ae64d-3cb3-4310-b59e-f1bbae9910a5@t39g2000prh.googlegroups.com>
2009-01-14  1:33 ` How to put 200 into an integer sub-type of 16 bits (code included) Brian Drummond
     [not found]   ` <3d3719f4-355c-4094-9902-495d612d46fe@n33g2000pri.googlegroups.com>
2009-01-14  9:06     ` Ludovic Brenta
2009-01-14 10:08     ` Georg Bauhaus
2009-01-14 10:29       ` Georg Bauhaus
2009-01-14 12:47     ` Brian Drummond
2009-01-14 12:53     ` Brian Drummond
     [not found]       ` <f4894476-851e-493f-93a2-168976bd97fb@s1g2000prg.googlegroups.com>
2009-01-14 16:08         ` Adam Beneschan
     [not found]           ` <139961e9-bae6-4e60-8ff7-4f4779b27481@z6g2000pre.googlegroups.com>
2009-01-14 20:41             ` Adam Beneschan
     [not found]               ` <1a2b31ac-cf6b-44e3-85b7-04594460db87@d36g2000prf.googlegroups.com>
2009-01-14 22:47                 ` Adam Beneschan
2009-01-14 23:11                 ` Ludovic Brenta
2009-01-15  9:56                 ` Stuart
2009-01-15 12:40                 ` Stuart
2009-01-15 14:02                 ` Stephen Leake
2009-01-15 15:54                   ` Dmitry A. Kazakov [this message]
2009-01-15 16:29                     ` Hyman Rosen
2009-01-15 22:15                       ` Dmitry A. Kazakov
2009-01-16  9:11                         ` Jacob Sparre Andersen
2009-01-16 11:03                           ` Mike H
2009-01-16 22:16                           ` Brian Drummond
     [not found]               ` <c265ffb7-6159-4d85-b259-78b830e115f9@v18g2000pro.googlegroups.com>
2009-01-15  2:39                 ` SteveD@teranews.com
     [not found]               ` <3625f980-4406-4f51-b494-dd4a48cab840@p36g2000prp.googlegroups.com>
2009-01-15  6:53                 ` Michael Bode
2009-01-15  8:57                   ` Martin
     [not found]               ` <fc154f52-7168-447a-bcd3-6ece9066ebf7@r37g2000prr.googlegroups.com>
2009-01-15 10:29                 ` Georg Bauhaus
2009-01-14 21:32             ` sjw
2009-01-14 21:51             ` Brian Drummond
2009-01-14 21:17           ` sjw
2009-01-14 18:49     ` Jeffrey R. Carter
2009-01-15 10:12       ` Quote of the Day (Re: " Peter Hermann
2009-01-14 21:09   ` sjw
2009-01-14 21:16     ` Adam Beneschan
2009-01-14 23:09       ` Martin
2009-01-15  0:07         ` Adam Beneschan
2009-01-15  3:09           ` Randy Brukardt
2009-01-15 16:28             ` Adam Beneschan
2009-01-15 21:21               ` Robert A Duff
2009-01-16  1:17                 ` Adam Beneschan
2009-01-16 14:55                   ` Robert A Duff
2009-01-15 14:44     ` Brian Drummond
     [not found]       ` <3f1f2f67-5d69-4baf-8e8c-0d2b5f68475f@p36g2000prp.googlegroups.com>
2009-01-15 16:36         ` How to put 200.0 (is float variable of 32 bits) into an integer sub-type of 10 bits (complete program included) Adam Beneschan
     [not found]         ` <8e64f509-f6fe-4d86-ae1a-fe0b1c88555a@v5g2000pre.googlegroups.com>
2009-01-15 17:09           ` christoph.grein
2009-01-15 17:17             ` Adam Beneschan
2009-01-15 17:29               ` Georg Bauhaus
     [not found]                 ` <09b4a056-688d-49c8-b935-fa0b30f1ae84@w1g2000prk.googlegroups.com>
2009-01-15 18:40                   ` Mike H
     [not found]                     ` <be26729d-9458-42fa-8c8c-004ca33b790d@f33g2000vbf.googlegroups.com>
2009-01-15 20:57                       ` Niklas Holsti
     [not found]                 ` <97231951-54a0-4df7-bb73-04261b34287f@e6g2000vbe.googlegroups.com>
2009-01-16  3:17                   ` Steve D
     [not found]             ` <a61abb30-bc60-4d13-b298-f369ddc8f741@z6g2000pre.googlegroups.com>
2009-01-15 18:15               ` Martin
2009-01-15 18:34               ` Stuart
2009-01-15 17:23           ` Georg Bauhaus
     [not found]         ` <d3b7ad53-af51-4ac5-9167-7cb99e61b2b1@v5g2000pre.googlegroups.com>
2009-01-15 17:50           ` Stuart
     [not found] <6c7964a6-1733-434b-b1b1-962baa4ebba2@p23g2000prp.googlegroups.com>
2009-01-13 21:01 ` How to put 200 into an integer sub-type of 16 bits (code included) Ludovic Brenta
replies disabled

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