In message: <[EMAIL PROTECTED]>
            Terry Lambert <[EMAIL PROTECTED]> writes:
: "M. Warner Losh" wrote:
: > And there's a comment:
: >  * 64-bit precision often gives bad results with high level languages
: >  * because it makes the results of calculations depend on whether
: >  * intermediate values are stored in memory or in FPU registers.
: > which seems like a compiler issue, not an OS issue to me.
: 
: The compiler must emit instructions to truncate and set flags, as
: well as generating pseudo-exceptions (should they be called for)
: in the case that the storage is in registers bigger than the memory
: backing them.  IT doesn't do this.

I think I don't understand what you are saying at all.  It doesn't
seem top jive with the rest of the messages in this thread.

: This is the basis of Bruce's complaint:
: 
: 
:http://docs.freebsd.org/cgi/getmsg.cgi?fetch=1099099+0+archive/2002/freebsd-current/20021027.freebsd-current
:
: | gcc can't actually support the full range, since it doesn't control
: | the runtime environement (it could issue a fninit before main() to
: | change the default, but it shouldn't and doesn't).  The exponent
: | range is lost long before printf() is reached.  E.g.,
: | 
: |         long double x= DBL_MAX;
: |         long double y = 2 * x;
: | 
: | gives +Inf for y since the result is doesn't fit in 53-bit precision.
: | The system header correctly reports this default precision.  Any header
: | genrated by the gcc build should be no different, since the build should
: | run in the target environment.

Except that's wrong, and further messages in the thread showed.  This
example shows that we don't support it in printf, since the above
example does ***NOT*** give +Inf, but rather whatever 2*DBL_MAX is.
The exponent range is ***NOT*** lost until printf truncates it, as my
test programs showed.

The one issue that I've seen is

    long double a = 1.0L;
    long double b = 1.0L + LDBL_EPSION
    if (a == b) abort();

which is what I'm trying to fix. (note, "1.0L" must be spelled
"oneld()" and long double oneld() { return (1.0L);}) to avoid the
optimizer getting it right.

Warner

To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to