Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 30 Oct 2002 17:01:54 -0700 (MST)
From:      "M. Warner Losh" <imp@bsdimp.com>
To:        tlambert2@mindspring.com
Cc:        bde@zeta.org.au, rittle@labs.mot.com, rittle@latour.rsch.comm.mot.com, current@FreeBSD.ORG, dschultz@uclink.Berkeley.EDU
Subject:   Re: Lack of real long double support
Message-ID:  <20021030.170154.35505346.imp@bsdimp.com>
In-Reply-To: <3DC06CE4.57CF2F96@mindspring.com>
References:  <20021030215500.E5692-100000@gamplex.bde.org> <20021030.162239.52163953.imp@bsdimp.com> <3DC06CE4.57CF2F96@mindspring.com>

next in thread | previous in thread | raw e-mail | index | archive | help
In message: <3DC06CE4.57CF2F96@mindspring.com>
            Terry Lambert <tlambert2@mindspring.com> 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 majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021030.170154.35505346.imp>