Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算C中浮点数的ε_C_Bits - Fatal编程技术网

计算C中浮点数的ε

计算C中浮点数的ε,c,bits,C,Bits,我必须使用位/整数运算来计算C中给定值的ε。根据位模式,我知道计算下一个邻居需要增加尾数,如果溢出,则增加指数-但我不确定从哪里开始计算ε 我不能使用浮点数学-所以我需要直接生成位模式。这使得它更复杂,因为我不能减法。 以下是我的理解(基于我在此所做的一些研究):随着数字变大,范围会发生明显变化,但我不确定如何使用FLT\u EPSILON生成正确的数字。对于2^2x数字,可能是(FLT_EPSILON-1)*number?如果你的EPSILON只是尾数的一个LSB增量的值,那么该值应该是2^(

我必须使用位/整数运算来计算C中给定值的ε。根据位模式,我知道计算下一个邻居需要增加尾数,如果溢出,则增加指数-但我不确定从哪里开始计算ε

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


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

如果你的EPSILON只是尾数的一个LSB增量的值,那么该值应该是2^(exp-23)。因此,如果您的输入是
[s][exp][尾数]
您的ε应该是
[0][exp-23][0]
。果然,当输入值为1.0(
[0][127][0]
)时,结果是
[0][104][0]
=2^-23=
FLT\u EPSILON

由于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);
float x;
*((int*)&x)=1;

*你的第一段写得对。但是,忘记
FLT\u EPSILON
:这就是
1.0f
的正EPSILON。编辑:检查编辑,应该已经清楚了。等等,你必须手动重新实现浮点减法?我应该只使用位运算符生成ε,我应该可以手动完成。我只是很困惑从哪里开始。为什么你不能使用浮点数学呢?这是家庭作业吗?你比我快。有一个+1。它是尾数的一个LSB增量,在溢出的情况下,也是指数的增量。这个属性仍然有效吗?@marchon在溢出边界有点棘手,但那是因为epsilon的定义在这里也被打破了。根据您使用的正式定义,可能需要对其进行调整。例如,1.0与1.0+eps的距离为2^-23,但与1.0-eps的距离仅为2^-24。在这种情况下,哪一个是正确的答案?上面的算法将给出两者中较大的一个,但您可以轻松添加一个签入,该签入将给出较小的值。可能最好同时计算两者并使用较小的值。谢谢对不起,我已经做了一段时间了——我看不出退回两张支票中较小的那张会是什么样的支票。我可以增加指数:if(尾数+1>=(1