设置FLT_EVAL_METHOD不起作用

nal*_*zok 4 c floating-point

#include <stdio.h>
#include <float.h>

#ifdef FLT_EVAL_METHOD
    #undef FLT_EVAL_METHOD
    #define FLT_EVAL_METHOD 1
#else
    #define FLT_EVAL_METHOD 1
#endif

int main(void)
{
    printf("%f\n%f\n", FLT_MAX, DBL_MAX);
    float fp = FLT_MAX;
    printf("%f\n", fp + 1);
    printf("%f\n", FLT_MAX + 1);
    printf("%f\n", (float) FLT_MAX + 1);
}
Run Code Online (Sandbox Code Playgroud)

预期的产出是:

340282346638528859811704183484516925440.000000
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000
340282346638528859811704183484516925441.000000
340282346638528859811704183484516925441.000000
340282346638528859811704183484516925441.000000
Run Code Online (Sandbox Code Playgroud)

但实际输出是:

340282346638528859811704183484516925440.000000
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000
340282346638528859811704183484516925440.000000
340282346638528859811704183484516925440.000000
340282346638528859811704183484516925440.000000
Run Code Online (Sandbox Code Playgroud)

既然FLT_EVAL_METHOD设置为1,那么不应该将所有float表达式都评估为doubles吗?什么"评价浮动和加倍为双倍,长加倍为双倍." 意思?是float小号处理相同的doubleS'

Ste*_*non 7

FLT_EVAL_METHOD不是程序员用来控制编译器的开关.它是编译器/平台向程序员报告如何评估浮点表达式的一种手段.你不应该改变它的价值,这样做不应该对任何事情产生任何影响.