sqrt(2) must go
Don
nospam at nospam.com
Thu Oct 20 05:13:33 PDT 2011
On 20.10.2011 13:12, Manu wrote:
> On 20 October 2011 11:02, Don <nospam at nospam.com
> <mailto:nospam at nospam.com>> wrote:
>
> On 20.10.2011 09:47, Manu wrote:
>
> Many architectures do not support real, and therefore it should
> never be
> used implicitly by the language.
>
> Precision problems aside, I would personally insist that implicit
> conversation from any sized int always be to float, not double, for
> performance reasons (the whole point of a compiled language trying
> to supersede C/C++).
>
>
> On almost all platforms, float and double are the same speed.
>
>
> This isn't true. Consider ARM, hard to say this isn't a vitally
> important architecture these days, and there are plenty of embedded
> architectures that don't support doubles at all, I would say it's a
> really bad idea to invent a systems programming language that excludes
> many architectures by its design... Atmel AVR is another important
> architecture.
It doesn't exclude anything. What we're talking about as desirable
behaviour, is exactly what C does. If you care about performance on ARM,
you'll type sqrt(2.0f).
Personally, I'd rather completely eliminate implicit conversions between
integers and floating point types. But that's just me.
> I maintain that implicit conversion of integers of any length should
> always target the same precision float, and that should be a compiler
> flag to specify the desired precision throughout the app (possibly
> defaulting to double).
I can't believe that you'd ever write an app without that being an
upfront decision. Casually flipping it with a compiler flag??
Remember that it affects very few things (as discussed below).
> If you choose 'float' you may lose some precision obviously, but you
> expected that when you chose the options, and did the cast...
Explicit casts are not affected in any way.
> Note that what we're discussing here is parameter passing of single
> values; if it's part of an aggregate (array or struct), the issue
> doesn't arise.
>
>
> Are we? I thought we were discussing implicit conversion of ints to
> floats? This may be parameter passing, but also assignment I expect?
There's no problem with assignment, it's never ambiguous.
There seems to be some confusion about what the issue is.
To reiterate:
void foo(float x) {}
void foo(double x) {}
void bar(float x) {}
void baz(double x) {}
void main()
{
bar(2); // OK -- 2 becomes 2.0f
baz(2); // OK -- 2 becomes 2.0
foo(2); // fails -- ambiguous.
}
My proposal was effectively: if it's ambiguous, choose double. That's all.
More information about the Digitalmars-d
mailing list