Joe said:
I haven't trimmed this post so that others might see everything. In any
case, this my last comment on the matter. You apparently can't read what
I write. There is no case that I know where 0.4999999999999999 will
result in a value greater than 0.5 . And you don't either. Nor does
anyone else.
Happy Turkey Day.
When discussing putative behaviour of C code there are
four common issues:
1. Behaviour dictated by the standard
2. Behaviour on common hosted implementations
3. Behaviour on non-hosted/embedded implementations
4. Behaviour on my implementation (depressingly often
i386/Microsoft vcc)
Aswers to 1. are important because these must apply to any
conforming implementation. However, in some ways the standard
is quite lax. E.g. RAND_MAX = 15 is legal, but no implementation
would provide such a thing. The answer to 1. is what
is commonly meant by "an implementation may"
Answers to 2. are important because this is what a user
may be expected to see. Of course "common" is context
dependent and a matter of opinoion. Are Cray and CDC
machines common? Should a machine designed in the
60's be considered common?
Answers to 3 can be important because this is a very
important sector for C programming, because
behaviours are often very different here, and because the
requirements of the standard are significantly different
for non-hosted systems.
Answers to 4 are usually irrelevant, and often very
wrong. Usually these take the form of examples
against a more general statment.
You said that i=1,i++ + i++ was undefined behaviour
but I tried it on my system and it gave 3 just like it
should.
My initial statement was a mix of 1 and 2 (I am
not familiar with the systems in 3). The standard
allows .4999999999999999 to be converted to a floating
point value > 0.5, but this is very unlikely. On the
other hand it is likely that some systems may convert
0.4999999999999999 to 0.5. (It is certain that some
systems will convert 0.49999999999999999 to 0.5)
The upshot is that is is likely that
floor(0.4999999999999999 +0.5) will equal 1 on some
systems (and certain that floor(0.49999999999999999 +0.5)
will equal 1 on some systems).
Your initial statement was pure 4.
You are wrong, You said that 0.4999999999999999
could be converted to a number greater than or equal
to 0.5. but I tried it on my sytem and it wasn't.
Your later statemenst mixed in some irrelevant 2
No system will convert 0.4999999999999999 to
a number greater than 0.5 (irrelevant because
mine was a staetment about legality (1.) not
whether the behaviour was common, and because
an alternate behaviour (converting to 0.5) was
both reasonable and leads to the same
undesirable result).
-William Hughes