Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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_Floating Point_Double_Precision - Fatal编程技术网

c语言中的双精度比较失败

c语言中的双精度比较失败,c,floating-point,double,precision,C,Floating Point,Double,Precision,可能重复: 我有一个数值(实)区间[x,y]。我必须使用以下方法对其进行迭代: nr = 0; for (i = x; i <= y; i += step) //step is a small double value nr++; nr=0; 对于(i=x;i 1.000) 如何计算精确的nr值?您需要使用整数来计算,或者对不精确感到满意,因为浮点和双精度本身就是不精确的*。您的代码完全按照C语言规范工作。在需要精确精度的情况下使用浮点和双精度是不安全的 除此之外,您还需要更多

可能重复:

我有一个数值(实)区间[x,y]。我必须使用以下方法对其进行迭代:

nr = 0;
for (i = x; i <= y; i += step) //step is a small double value
    nr++;
nr=0;
对于(i=x;i 1.000)


如何计算精确的nr值?

您需要使用整数来计算,或者对不精确感到满意,因为浮点和双精度本身就是不精确的*。您的代码完全按照C语言规范工作。在需要精确精度的情况下使用浮点和双精度是不安全的

除此之外,您还需要更多关于您的需求的信息。如果
nr
是一个温度,那么要计算精确值,你需要使用不存在或不存在的物理(我不是物理学家,所以我不能告诉你)。如果
步骤
实际上是一个不合理的值,那么您必须向上或向下取整-您的呼叫和正确性取决于您的业务逻辑需求。如果它是有理数且不需要舍入,则需要乘以最小公分母,然后使用
int
s(或C或类似的分数类)


*当分数的分母为2的幂时,每个注释的浮点/双精度是精确的,如果您可以强制
步骤
y
符合这一点,您的问题将有点清楚,当然,如果
步骤
没有平均划分为
y
,您将需要执行与上述完全相同的业务逻辑处理。

您遇到的问题是浮点数(
浮点
双精度
)没有准确地存储,因此在内存中的表示往往更准确

因此,您有两种选择-使用精确的数字或使用整数计算循环的次数,然后计算值

这可以通过以下方式完成:

int numberOfIntervals = 2000;
double lowestValue = -1.0;
for (loop = 0; loop <= numberOfIntervals; ++loop)
{
    double v = (0.001 * loop ) + lowestValue;
}
int numberofinterval=2000;
双下限值=-1.0;

对于(loop=0;loop二进制浮点不精确的说法并不正确。对于内容符合不同(正和/或负)之和的数字,才是正确的二次幂的值是精确的。显然,十进制数字符合十次幂的和,所以它们不精确。基数四、八和十六符合,因为它们是二的倍数

我很久以前就发过这篇文章,它会给你一个关于浮点数的精确性的提示。你也可以看到分数是如何通过两个负幂的和来组合的


至于如何解决这个问题,你有你需要的工具。如果算法不合适,你可以让它合适。

float
/
double
本质上是不精确的;如果你需要“精确的,”使用整数类型你真的只想计算步数,还是循环体中会有更多步数?将包含什么?nr表示映射到实平面上的图像的高度。我在for(s)中计算一些像素值。我理解不可能精确计算nr,因此我将坚持使用“height=(int)((y-x)/step.@BoPersson:这个问题并没有像你建议的复制品那样问为什么总和不正确。如果逐字阅读,这个问题问的是如何计算地板((y-x)/step)正是。你将如何解决这个问题?我不知道,因为我不知道你的应用程序要求是什么。还有,你尝试了什么?这既不能回答问题,也不能解释为什么代码不能按预期运行。@EricPostphil-fair,在评论和相应的so中添加了被认为不精确的信息OP可能处理但未指定的所有可能情况的解决方案。”不精确"因为对浮点的泛化是无效的。浮点在某些条件下是不精确的,而在其他条件下则不精确。请参阅我的答案。在堆栈溢出中提出类似问题的许多情况下,循环会明显转换为整数。然而,在这种情况下,x和y是任意浮点值,并且不是显然,如何实现所需的计算,这里有一个有趣的问题,它不仅仅是一个简短的答案。我们应该考虑<代码> x<代码>,<代码> y>代码>和<代码>步骤< />代码,这可能会产生一个不正确的值。我现在使用的解决方案。但是,它将计算nr=2000。另外,在每次迭代中避免I*步乘法不是更快吗?@gg.kaspersky:
I*步
在典型处理器上并不昂贵,除非您使用的是一些动力不足的嵌入式处理器。C的美妙之处在于,您可以控制精度和性能之间的权衡n(带整数和乘法的循环)或速度(带双精度和无乘法的循环)实际上,十进制数也符合二的幂和:11=8+2+1,我们可以使用二进制以及任意基对其精确值进行编码。区别不是整数二进制/十进制基表示,而是整数/实数。因此,如果十进制数也符合二的幂,为什么程序不能工作?我错了我理解你所说的(我的英语很差)。我以为你指的是整数十进制数,但你指的是分数。你最初的问题包含了小数同时包含整数和分数的问题。这就是我的答案。
int nsteps = (int)((y-x)/step);
for(int i=0; nsteps; ++i){
   double v = x + (i*step);  // use v in your calculations
}