我必须使用位/整数运算来计算C中给定值的epsilon。我知道计算下一个邻居的位模式涉及递增尾数,如果溢出,则增加指数 - 但我不知道从计算epsilon的角度开始。
我不能使用浮点数学 - 所以我需要直接生成位模式。这使得它更加棘手,因为我无法减去。
这是我的理解(基于我在此处所做的一些研究):随着数字变大,范围会发生明显变化,但我不确定如何使用{{1}生成正确的数字。对于2 ^ 2x数字,可能是FLT_EPSILON
?
答案 0 :(得分:3)
如果你的epsilon只是尾数一个LSB增量的值,那么该值应该是2 ^(exp-23)。因此,如果您的输入为[s][exp][mantissa]
,则您的epsilon应为[0][exp-23][0]
。果然,当输入为1.0([0][127][0]
)时,结果为[0][104][0]
= 2 ^ -23 = FLT_EPSILON
。
答案 1 :(得分:1)
由于IEEE 754格式,您需要1个尾数,127个移位到23
float x;
*((int*) &x) = 1;
*((int*) &x) = *((int*) &x) | 104 << 23;
printf("%.12f\n", FLT_EPSILON);
printf("%.12f\n", x);