在 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