Re: Should rand() return a RAND_MAX value for 32 bit target?

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

 



在 2018-09-20 23:58, Vincent Lefevre 写道:
> On 2018-09-20 23:21:23 +0800, Liu Hao wrote:
>> `2147483647` is an integer constant. This rule only describes floating
>> constants, so it does not apply.
> 
> Actually the fact that it is a constant doesn't matter, but...
> 

The paragraph quoted by the previous message contains a sentence saying 
'...  and of floating constants are evaluated to a format ...'. While 
all following paragraphs don't mention `floating constants` explicitly, 
it is implied.

If it could be said that 'constants' included integer constants here 
then I would also reasonably think that 'all operations' here also 
included operations involving only integers - which does not make any 
sense at all.

This is not the place for discussion of the C standard. Anyway I don't 
see any problems in GCC's implementation.

>> According to '6.3.1.8 Usual arithmetic conversions', here `2147483647`
>> is converted to a value having type `float`, which is then compared with
>> `f` using the internal `long double` type.
> 
> The conversion of the int needs to be done with the precision and
> range of long double since this is neither an assignment nor a cast.
> 

If there is no indeterminate results (as in your example) then there is 
no difference.

An example where this truncation does matter is as follows, tested on 
Linux Mint 19, x64 with GCC 7.3 :

-----
lh_mouse@lhmouse-ideapad ~/Desktop $ cat test.c
#include <stdio.h>
#include <float.h>

float a = 0x1.0002p0;
float b = 0x1.0003p0;
float c = 0x1.0005p0;

int main(void)
   {
     printf("FLT_EVAL_METHOD = %d\n", (int)FLT_EVAL_METHOD);
     printf("a * b == c        ?   %d\n", a * b == c);
     printf("a * b == (float)c ?   %d\n", a * b == (float)c);
   }
lh_mouse@lhmouse-ideapad ~/Desktop $ gcc test.c  -std=c99 -O0 -m32 
-march=pentium4 -mfpmath=sse && ./a.out
FLT_EVAL_METHOD = 0
a * b == c        ?   1
a * b == (float)c ?   1
lh_mouse@lhmouse-ideapad ~/Desktop $ gcc test.c  -std=c99 -O0 -m32 && 
./a.out
FLT_EVAL_METHOD = 2
a * b == c        ?   0
a * b == (float)c ?   0
-----


-- 
Best regards,
LH_Mouse




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux