floating point verification using is?
Steven Schveighoffer
schveiguy at yahoo.com
Mon Dec 28 23:02:58 PST 2009
On Mon, 28 Dec 2009 21:52:24 -0500, Don <nospam at nospam.com> wrote:
> Steven Schveighoffer wrote:
>> Whether you like it or not, the runtime must initialize it to
>> something, even if the value means "uninitialized".
>
> The key question is: is it valid to read an uninitialized variable? I
> would hope the compiler would flag that as an error. The use of
> signalling NaNs was based on the assumption that you should *never* be
> reading uninitialized variables.
>
> A consequence is that you should also NEVER read float.init!
I am not even close to a floating point expert. In fact, I try to avoid
them like the plague. All I want to do is verify that the bit pattern
being written to a memory location is the bit pattern I expect to be
written. How do I do that without comparing what I expect to what I wrote?
>
>> That value should always be consistent. There has to be a way to
>> verify that the value was set properly. Otherwise, how do you verify
>> things
>> like communication protocols or expectations for runtime functions?
>
> I think that sending an uninitialized variable down a communication
> channel is always a bug.
Just wait, someone will define it :) If I want to verify that it's any
value *but* T.init, how do I do that? And I don't think using <>=!@%$ to
do it is worth the trouble.
>> It has to be a bit pattern, because all other T.init values, including
>> those of aggregates which might contain floating points, are bit
>> patterns.
>>
>>> Consider this code:
>>>
>>> T x;
>>> if (x==T.init) { writefln("x is uninitialized"); }
>>>
>>> Is this code valid? You are reading the value of an uninitialized
>>> variable.
>> Correct that to:
>> T x;
>> if(x is T.init) {writefln("x is uninitialized"); }
>> Then I think it is valid. I don't care if == is hijacked away from
>> bitwise comparison, in fact, it is necessary in many cases. But there
>> should be a way to do bitwise comparison for verification, and 'is'
>> fits the bill perfectly.
>
> That does preclude a compiler from ever giving you errors/warnings about
> using uninitialized variables. I think it's wrong.
I'm not using it in every-day code (although I don't think it's wrong to
do so), I'm using it for asserts and unit tests. I'm asserting that
what's happening is what I expect is happening. To make this unreasonably
difficult makes no sense to me. To say "is works on everything but
floating point initializers" sounds ridiculously inconsistent. Maybe
preventing it is the Right Thing to do, but it is possible to do, so what
harm can it cause? It wouldn't even cause an exception.
Note that I don't think == should change behavior, just 'is'.
-Steve
More information about the Digitalmars-d-learn
mailing list