From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,772ddcb41cd06d5b X-Google-Attributes: gid103376,domainid0,public,usenet X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news1.google.com!news4.google.com!feeder.news-service.com!npeer.de.kpn-eurorings.net!npeer-ng1.kpn.DE!newsfeed.straub-nv.de!aioe.org!not-for-mail From: Keith Thompson Newsgroups: comp.lang.ada Subject: Re: How to check a Float for NaN Date: Thu, 01 May 2008 12:52:16 -0700 Organization: None to speak of Message-ID: <87ve1xztsf.fsf@kvetch.smov.org> References: <3132e38d-18bb-4890-9cec-31056ac6e3ba@x19g2000prg.googlegroups.com> <6f7cd771-16b7-4729-9536-2a7d1c28a9cd@2g2000hsn.googlegroups.com> <93b0d930-102a-4ac4-8b85-48e87d9d3df1@j33g2000pri.googlegroups.com> <1216f027-8fa4-45df-9b84-ae387164505b@p25g2000pri.googlegroups.com> NNTP-Posting-Host: aVIvKdUSjN4PsAbmZ6BGcQ.user.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Complaints-To: abuse@aioe.org Cancel-Lock: sha1:0SEoAHy1GBpsrHfsSvbTzyUNOiE= User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.1 (gnu/linux) Xref: g2news1.google.com comp.lang.ada:21166 Date: 2008-05-01T12:52:16-07:00 List-Id: Adam Beneschan writes: > On Apr 30, 4:23 pm, I wrote: >> On Apr 30, 1:33 pm, Jerry wrote: >> > Thanks for the insight. From my point of view, not having access to >> > the all the IEEE-754 features is a nuisance. I'm not sure what I'm >> > going to do--probably try in import the C function isnan. >> >> Be careful with that, too. On my (Pentium Linux) system, the man page >> for "isnan" says it takes a "double", which I think means a 64-bit >> float. > > Ha, ha, ha, the man page lied. Apparently (on my system) isnan is a C > macro (in ), which will call one of three routines depending > on the size of the float. But since isnan is a macro, doing an Import > pragma on it is likely going to fail since "isnan" is not the name of > an actual routine in the library. That's on my OS, though; who knows > how it works on yours. > > Anyway, good luck and have fun getting this to work. The C99 C standard (which is not widely implemented, at least not completely) specifies that isnan() is a macro that can take an argument of any floating-point type (float, double, long double). It might typically be implemented by invoking one of three functions depending on the size of the argument, but the standard doesn't specify any particular method; it could be pure magic. The earlier C90 standard doesn't provide any such floating-point classification macros or functions. Some C90 implementations might provide a function, rather than macro, called "isnan"; perhaps that's what your system documents. You can't interface to a C macro from Ada (as far as I know), but you can easily write a wrapper function. Assuming your C implementation provides the isnan() macro as specified by C99, you can do this: #include int float_isnan (float x) { return isnan(x); } int double_isnan (double x) { return isnan(x); } int long_double_isnan (long double x) { return isnan(x); } and then provide Ada interfaces to those C functions. It's a bit of a roundabout way to do it (providing three distinct function wrappers for a single macro that's probably a wrapper for three distinct underlying functions), but it should work. -- Keith Thompson (The_Other_Keith) Nokia "We must do something. This is something. Therefore, we must do this." -- Antony Jay and Jonathan Lynn, "Yes Minister"