bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Removing -Wunsuffixed-float-constants, -Wdouble-promotion, -Wformat-


From: Eric Blake
Subject: Re: Removing -Wunsuffixed-float-constants, -Wdouble-promotion, -Wformat-zero-length
Date: Tue, 29 Nov 2011 14:46:20 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:8.0) Gecko/20111115 Thunderbird/8.0

On 11/29/2011 02:38 PM, Jim Meyering wrote:
>> I'm not convinced about removing it from manywarnings.m4 - it's not that
>> hard to disable the warning if you don't want it, but leaving it in
>> leads to smaller executable size for the cases where 1.0F is sufficient
>> (compared to the extra size required to represent 1.0 which is 1.0D).
>> By explicitly marking F or D to all float constants, it shows you've
>> thought about which precision is worth using; omitting the suffix could
>> be the sign of sloppy code that has other problems with misuse of
>> floating point.
> 
> Inspired by that, I went to see what would be required for coreutils to pass.
> Are these "D" and "F" really worth it?
> 
> Unless there are objections (portability?)

Aargh.  I just reread C99.

F (and f) for float, and L (or l) for long double are required, but D
(or d) for double is a GNU extension.

Since we can't silence the warning without adding an explicit 'D', but
'D' is not standardized, I have changed my mind.  Let's nuke the warning.

Meanwhile, your patch for adding 'F' is okay, but not for adding 'D'.
That is,

> +++ b/lib/hash.c
> @@ -113,8 +113,8 @@ struct hash_table
>     1.0).  The growth threshold defaults to 0.8, and the growth factor
>     defaults to 1.414, meaning that the table will have doubled its size
>     every second time 80% of the buckets get used.  */
> -#define DEFAULT_GROWTH_THRESHOLD 0.8
> -#define DEFAULT_GROWTH_FACTOR 1.414
> +#define DEFAULT_GROWTH_THRESHOLD 0.8F
> +#define DEFAULT_GROWTH_FACTOR 1.414F

this change makes sense,

> @@ -238,7 +238,7 @@ hash_print_statistics (const Hash_table *table, FILE 
> *stream)
>    fprintf (stream, "# buckets:         %lu\n", (unsigned long int) 
> n_buckets);
>    fprintf (stream, "# buckets used:    %lu (%.2f%%)\n",
>             (unsigned long int) n_buckets_used,
> -           (100.0 * n_buckets_used) / n_buckets);
> +           (100.0F * n_buckets_used) / n_buckets);

but this does not (in var-args, float gets promoted to double, so you
probably aren't gaining anything by using 'float' as an intermediary,
and starting with '100.0' as double is better to begin with).

> @@ -73,7 +73,7 @@ struct timespec dtotimespec (double);
>  static inline double
>  timespectod (struct timespec a)
>  {
> -  return a.tv_sec + a.tv_nsec / 1e9;
> +  return a.tv_sec + a.tv_nsec / 1e9D;

Likewise, this one is not portable.

-- 
Eric Blake   address@hidden    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]