reature request: fixed point
Bill Baxter
dnewsgroup at billbaxter.com
Sat Mar 1 20:37:26 PST 2008
Jb wrote:
> "Walter Bright" <newshound1 at digitalmars.com> wrote in message
> news:fqd3c0$12pt$1 at digitalmars.com...
>> kov_serg wrote:
>>> Is it possible to add to "Basic Data Types" one more type?
>>>
>>> fixed point type is intermediate type between fload and integer. Build in
>>> support of fixed point type will great help in realtime signal and image
>>> processing. 32 bit fixed point with 16bit for integer part and 16 bit of
>>> fraction is very easy implemented on any 32bit CPU and have good
>>> performance. Especially if CPU has no FPU.
>>>
>>> fixed x; // 32bit min=-0x8000.0000 max=0x7FFF.FFFF
>>> ...
>>> fixed a=3.14, b=2.3, c=-5.3;
>>> fixed d=a*b/c;
>>>
>>> What you think about including "fixed" type in D 2.0?
>> It isn't too hard to do fixed point arithmetic:
>>
>> typedef int Fixed;
>> Fixed fixed(int m, int n) { return cast(Fixed)(m * 0x10000 + n); }
>>
>> Fixed a = fixed(3,14);
>> Fixed b = fixed(2,3);
>> Fixed c = -fixed(5,3);
>> Fixed d = a * b / c;
>
> The results of multiplies need to be shifted right, and divisions need to be
> shifted left. Actualy for division it's best to shift the numerator left
> before the division. But i dont see how your example would do that. Your
> example should be...
>
> (((a*b) >> 16) << 16) / c
>
> In that case the shifts cancel out. But this..
>
> (((a*b)+c) / d
>
> Would have to be..
>
> ((((a*b) >> 16)+c) << 16) / d
>
> And one problem is whether the compiler will return an int64 for a 32 bit
> multiply, and then will it do the correct shift. I mean to multiply two
> 16.16 numbers you need at least a 48 bit result.
>
> In assembler it should be somthing like...
>
> MOV EAX,A
> IMUL B
> SHRD EAX,EDX,16
>
> Is the compiler smart enough to generate that kind of code from...
>
> d = (a*b) shr 16;
>
> ??
>
>
Well, you can do inline assembly in your code, if that's what you really
want.
--bb
More information about the Digitalmars-d
mailing list