Should rand() return a RAND_MAX value for 32 bit target?
Liu Hao
lh_mouse@126.com
Fri Sep 21 02:49:00 GMT 2018
在 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
More information about the Gcc-help
mailing list