我需要找到一个2的幂,当加到FLT_MAX时会导致溢出。然而,当我打印非常大的功率,如2^300,inf仍然没有出现。此外,我认为FLTYMAX是表示的最大浮点,加1将立即导致溢出。

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

int main(){
    float f = FLT_MAX;
    printf("%f", f + pow(2,300));
}

任何帮助都将不胜感激。谢谢!

最佳答案

答案是(FLT_MAX - nextafterf(FLT_MAX, 0))/2,也就是0x1p+ 103或大约1.014120 480e + 31。
确定答案的方法有一个错误:标准函数pow返回adouble,而C's “usual arithmetic conversions” (C11 6.3.1.8:1)表示表达式f + pow(2,300)计算为adouble。由于参数是如何传递给变量函数的,因此它会被打印为double
This C program显示如何获得float值,该值通过FLT_MAX加法添加到float中,将导致float无穷大:

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

int main(){
    float f = FLT_MAX;
    printf("FLT_MAX: %a\n", f);
    float b = nextafterf(f, 0);
    printf("number before FLT_MAX: %a\n", b);
    float d = f - b;
    printf("difference: %a\n", d);
    printf("FLT_MAX + d: %a\n", f + d);
    printf("FLT_MAX + d/2: %a\n", f + d/2);
    printf("FLT_MAX + nextafterf(d/2,0): %a\n", f + nextafterf(d/2,0));
    float answer = d/2;
    printf("answer: %a %.9e\n", answer, answer);
}

它打印:
FLT_MAX: 0x1.fffffep+127
number before FLT_MAX: 0x1.fffffcp+127
difference: 0x1p+104
FLT_MAX + d: inf
FLT_MAX + d/2: inf
FLT_MAX + nextafterf(d/2,0): 0x1.fffffep+127
answer: 0x1p+103 1.014120480e+31

它表明,如果你把FLT_MAX和它的下邻居之间的差异(称之为这个差异d),正如你所料,添加到d中的FLT_MAX会产生inf。但这不是可以添加到float以生成FLT_MAX的最小inf-有更小的候选。只需将d的一半添加到FLT_MAX即可得到inf的结果。另一方面,如果加得小于这个数,则结果向下舍入到FLT_MAX

10-08 02:34