On 4/21/2010 7:00 PM, Bill Baxter wrote:
I don't find it that useful either. Seems to me the only use is to
preserve a few more bits in intermediate computations. But finite
precision is finite precision. If you're running up against the
limitations of doubles, then chances are it's not just a few more bits
you need -- you either need to rethink your algorithm or go to
variable precision floats.
Maybe just rename 'real' to something less inviting, so that only the
people who really need it will be tempted to use it. Like __real or
__longdouble, or __tempfloat or something.
--bb
On Wed, Apr 21, 2010 at 3:38 PM, bearophile<bearophileh...@lycos.com> wrote:
I suggest to remove the real type from D2 because:
- It's the only native type that has not specified length. I'm sold on the
usefulness of having defined length types. Unspecified length types causes some
of the troubles caused by C types that D has tried to avoid defining the size
of its integral types.
- Its length is variable across operating systems, it can be 10, 12, 16 bytes,
or even just 8 if they get implemented with doubles. The 12 and 16 bytes long
waste space.
- Results that you can find with programs written in other languages are
usually computed with just floats or doubles. If I want to test if a D program
gives the same results I can't use reals in D.
- I don't see reals (long doubles in C) used much in other languages.
- If I compile a program with LDC that performs computations on FP values, and
I take a look at the asm it produces, I can see onl SSE-related instructions.
And SSE registers allow for 32 and 64 bit FP only. I think future AVX
extensions too don't support 79/80 bit floats. GPUs are increasingly used to
perform computations, and they don't support 80 bit floats. So I think they are
going to be obsolete. Five or ten years from now most numerical programs will
probably not use 80 bit FP.
- Removing a built-in type makes the language and its manual a little simpler.
- I have used D1 for some time, but so far I have had hard time to find a
purpose for 80 bit FP numbers. The slight increase in precision is not so
useful.
- D implementations are free to use doubles to implement the real type. So in a
D program I can't rely on their little extra precision, making them not so
useful.
- While I think the 80 bit FP are not so useful, I think Quadrupe precision FP
(128 bit, currently usually software-implemented) can be useful for some
situations, (http://en.wikipedia.org/wiki/Quadruple_precision ). They might be
useful for High dynamic range imaging too. LLVM SPARC V9 will support its
quad-precision registers.
- The D2 specs say real is the "largest hardware implemented floating point
size", this means that they can be 128 bit too in future. A numerical simulation
that is designed to work with 80 bit FP numbers (or 64 bit FP numbers) can give strange
results with 128 bit precision.
So I suggest to remove the real type; or eventually replace it with fixed-sized
128 bit floating-point type with the same name (implemented using a software
emulation where the hardware doesn't have them, like the __float128 of GCC:
http://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html ).
In far future, if the hardware of CPUs will support FP numbers larger than 128
bits, a larger type can be added if necessary.
Bye,
bearophile
Just a personal preference, but I always disliked "secret" features of
languages hidden behind underscores. I feel like features should be
part of the standard spec or not there at all.