我需要找到一个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
。