Deutsch English Français Italiano |
<v2ikkn$mmds$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!news.misty.com!2.eu.feeder.erje.net!feeder.erje.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: BGB <cr88192@gmail.com> Newsgroups: comp.arch Subject: Re: Making Lemonade (Floating-point format changes) Date: Tue, 21 May 2024 12:11:47 -0500 Organization: A noiseless patient Spider Lines: 90 Message-ID: <v2ikkn$mmds$1@dont-email.me> References: <abe04jhkngt2uun1e7ict8vmf1fq8p7rnm@4ax.com> <memo.20240512203459.16164W@jgd.cix.co.uk> <v1rab7$2vt3u$1@dont-email.me> <20240513151647.0000403f@yahoo.com> <v1to2h$3km86$1@dont-email.me> <20240514221659.00001094@yahoo.com> <v234nr$12p27$1@dont-email.me> <20240516001628.00001031@yahoo.com> <v2cn4l$3bpov$1@dont-email.me> <v2d9sv$3fda0$1@dont-email.me> <20240519203403.00003e9b@yahoo.com> <v2etr0$3s9r0$1@dont-email.me> <20240520113045.000050c5@yahoo.com> <v2ff99$3vq7q$1@dont-email.me> <20240520153630.00000b5a@yahoo.com> <v2g529$4fn7$1@dont-email.me> <be08fc860572f2ea80b6d3530161aefd@www.novabbs.org> <v2guog$ctck$1@dont-email.me> <v2hcm3$f1pd$1@dont-email.me> <20240521111903.00004ca1@yahoo.com> <v2hvu8$ikpg$1@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Tue, 21 May 2024 19:11:51 +0200 (CEST) Injection-Info: dont-email.me; posting-host="46cc854e5f55f7c187177de16fb06ef0"; logging-data="743868"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18m4NO0c2iciJBhs+tFFP8FDgTt+Ze5kgc=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:zSPyZFQOugRBktFIzfjcwhSNglk= Content-Language: en-US In-Reply-To: <v2hvu8$ikpg$1@dont-email.me> Bytes: 4483 On 5/21/2024 6:18 AM, Terje Mathisen wrote: > Michael S wrote: >> On Tue, 21 May 2024 05:49:55 -0000 (UTC) >> Thomas Koenig <tkoenig@netcologne.de> wrote: >> >>> BGB <cr88192@gmail.com> schrieb: >>> >>>> Granted, they are not necessarily the option one would go if they >>>> wanted "cheapest possible FPU that is still good enough to be >>>> usable". >>>> >>>> Though, the point at which an FPU manages to suck badly enough that >>>> one needs to resort to software emulation to make software work, is >>>> probably a lower limit. >>>> >>>> >>>> Luckily, "uses 754 formats, but with aggressive cost cutting" can >>>> be "good enough", and so long as they more-or-less deliver a full >>>> width mantissa, and can exactly compute exact-value calculations, >>>> most software is generally going to work. >>> >>> This will require extensive testing and possibly modification for >>> a lot of software ported to such a system. This will drive up >>> the total cost, presumably far more than any hardware savings. >>> >>>> But OTOH, if 1.0+2.0 gives 2.999999, that is, not good enough, so >>>> there is a lower limit here. >>> >>> An example of a more interesting question is >>> >>> if (a >= 0.) { >>> if (b >= 0) { >>> if (a + b < a) { >>> printf("We should never get here!\n); >>> abort(); >>> } >>> } >>> } >> >> If I am not mistaken, that should hold on VAX, which has floating-point >> very close to BGB ideal. It looks like it would hold even on less >> robust formats, like IBM's hex float. I wonder where it is not true? >> >> The biggest difference between IEEE and VAX is that on IEEE when (a > b) >> then (a - b > 0) while on VAX (a - b >= 0). >> >> Of course, IEEE has non-intuitive cases as well. >> if (!(a < 0)) { >> if (!(b < 0)) { >> if (!(a + b >= a)) { >> printf("It's IEEE 754, baby!\n); >> } >> } >> } >> > What happens when a and/or b is a NaN? > > Comparisons with NaN should return false, so !(NaN < 0) will be true > (and the same for b), while !(NaN+b >= NaN) will also return true. > > Is that what you were thinking of? > Had not considered NaN's here. Currently, FCMPEQ will be false on NaN, whereas FCMPGT ignores NaN's. I guess possible could be to add an FCMPGE instruction, and then make both FCMPGT and FCMPGE be false on NaN (where the LT and LE cases can be handled by flipping the arguments, so would still be false on NaN). So, as-is: if(!(a==a)) { //NaN } But, as-is: if(a>0) { //May still potentially get here with NaN } .... > Terje >