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>
