comp.lang.ada
 help / color / mirror / Atom feed
From: Ludovic Brenta <ludovic@ludovic-brenta.org>
Subject: Re: Conversion from floating point to signed 16 bits
Date: Tue, 19 May 2009 13:06:53 -0700 (PDT)
Date: 2009-05-19T13:06:53-07:00	[thread overview]
Message-ID: <ce890d73-6671-4f96-b1ce-bd15d1852114@s31g2000vbp.googlegroups.com> (raw)
In-Reply-To: 4a12ffa3$0$2853$ba620e4c@news.skynet.be

On May 19, 8:51 pm, Olivier Scalbert <olivier.scalb...@algosyn.com>
wrote:
> Hello,
>
> My problem:
> I need to convert an "analogic" value which can vary from 0.0 to 1.0
> into a "discrete" value which is a signed 16 bits integer.
>
> My implementation:
> -----------------------------
> with Ada.Text_IO;
>
> procedure convert is
>      type Analog_Value is digits 10 range 0.0 .. 1.0;
>      type Signed_16    is range -32768 .. 32767;
>      type Unsigned_16  is range      0 .. 65535;
>
>      function Cv(Value: Analog_Value) return Signed_16 is
>          U16: Unsigned_16;
>      begin
>          U16 := Unsigned_16(65535.0 * Value);
>          return Signed_16(U16 - 32768);
>      end Cv;
>
>      procedure Put(S16: Signed_16) is
>      begin
>          Ada.Text_IO.Put_Line(Signed_16'image(S16));
>      end put;
> begin
>     Put(Cv(0.00)); -- Must be -32768
>     Put(Cv(0.25)); -- Must be -16384
>     Put(Cv(0.50)); -- Must be      0
>     Put(Cv(0.75)); -- Must be  16383
>     Put(Cv(1.00)); -- Must be  32767
> end convert;
> -----------------------------
>
> My question:
> Is there an other way to do this in Ada (Representation ? Other parts of
> Ada I do not know ?)
>
> My thanks:
> Thank you very much !
> ;-)

Your requirements seem a bit strange to me.  Could you please explaun
why you need the integer to be signed?  Ada has direct support for
fixed-point types (RM 3.5.9).  They would work like this:

0.0            => 2#0000_0000_0000_0000#
0.25           => 2#0100_0000_0000_0000#
0.5            => 2#1000_0000_0000_0000#
0.75           => 2#1100_0000_0000_0000#
1.0-2.0**(-16) => 2#1111_1111_1111_1111#

If you interpret the 16 bits as an unsigned integer, you get

    0
16384
32768
49152
65535

If you interpret these same 16 bits as a signed integer, due to two's
complement you get

 0
 16384
-32768
-16384
-1

Here is my program using this feature:

with Ada.Unchecked_Conversion;
with Interfaces;
with Ada.Text_IO;
procedure Conversion is
   type Analog_Value is delta 2.0 ** (-16) range 0.0 .. 1.0; -- fixed-
point
   for Analog_Value'Size use 16;

   function "+" is
      new Ada.Unchecked_Conversion (Source => Analog_Value,
                                    Target => Interfaces.Integer_16);

   procedure Put (S16 : in Interfaces.Integer_16) is
   begin
      Ada.Text_IO.Put_Line (Interfaces.Integer_16'Image (S16));
   end Put;

begin
   Put (+0.0);
   Put (+0.25);
   Put (+0.5);
   Put (+0.75);
   Put (+(1.0 - Analog_Value'Small));
end Conversion;

I am aware that my program does not address the exact requirement you
expressed but I'm curious to know what the high-level requirement is,
i.e. why you need the conversion in your example.

--
Ludovic Brenta.



  parent reply	other threads:[~2009-05-19 20:06 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-19 18:51 Conversion from floating point to signed 16 bits Olivier Scalbert
2009-05-19 19:37 ` Adam Beneschan
2009-05-19 19:57   ` Jeffrey R. Carter
2009-05-19 22:36     ` Adam Beneschan
2009-05-19 19:55 ` Jeffrey R. Carter
2009-05-19 20:06 ` Ludovic Brenta [this message]
2009-05-19 22:08   ` Olivier Scalbert
2009-05-20  8:29 ` Stuart
2009-05-20  8:48   ` Stuart
2009-05-20 11:11 ` Georg Bauhaus
2009-05-20 12:06   ` Martin
2009-05-20 15:18     ` Jeffrey R. Carter
2009-05-20 15:23       ` Martin
2009-05-20 15:47         ` Adam Beneschan
2009-05-20 16:13           ` Martin
replies disabled

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