在C中计算浮子的epsilon

时间:2014-07-23 15:53:44

标签: c bits

我必须使用位/整数运算来计算C中给定值的epsilon。我知道计算下一个邻居的位模式涉及递增尾数,如果溢出,则增加指数 - 但我不知道从计算epsilon的角度开始。

我不能使用浮点数学 - 所以我需要直接生成位模式。这使得它更加棘手,因为我无法减去。

这是我的理解(基于我在此处所做的一些研究):随着数字变大,范围会发生明显变化,但我不确定如何使用{{1}生成正确的数字。对于2 ^ 2x数字,可能是FLT_EPSILON

2 个答案:

答案 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);