Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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
两个浮点加法不会改变结果 #包括 int main() { int循环计数器=0; 浮动数据1、数据2; 数据1=2000.0f; 数据2=0.0001f; 而(1) { data1=data1+data2; printf(“循环计数器%d,数据%f\n”,循环计数器,数据1); loopCounter++; } 返回0; }_C_Floating Point_Add_Precision - Fatal编程技术网

两个浮点加法不会改变结果 #包括 int main() { int循环计数器=0; 浮动数据1、数据2; 数据1=2000.0f; 数据2=0.0001f; 而(1) { data1=data1+data2; printf(“循环计数器%d,数据%f\n”,循环计数器,数据1); loopCounter++; } 返回0; }

两个浮点加法不会改变结果 #包括 int main() { int循环计数器=0; 浮动数据1、数据2; 数据1=2000.0f; 数据2=0.0001f; 而(1) { data1=data1+data2; printf(“循环计数器%d,数据%f\n”,循环计数器,数据1); loopCounter++; } 返回0; },c,floating-point,add,precision,C,Floating Point,Add,Precision,我使用GCC编译器在Linux机器上运行这段代码,但是如果添加的2浮点值达到值2048.0,它就不再改变了 有人知道为什么会这样吗 有人知道为什么会这样吗 因为浮点精度 阅读 请注意: #include<stdio.h> int main() { int loopCounter = 0; float data1,data2; data1 = 2000.0f; data2 = 0.0001f; while(1) {

我使用GCC编译器在Linux机器上运行这段代码,但是如果添加的2浮点值达到值
2048.0
,它就不再改变了

有人知道为什么会这样吗

有人知道为什么会这样吗

因为浮点精度

阅读

请注意:

#include<stdio.h>

int main()
{

    int loopCounter = 0;    
    float data1,data2;

    data1 = 2000.0f;
    data2 = 0.0001f;

    while(1)
    {               
      data1 = data1 + data2;
      printf("Loop Counter %d , Data %f\n",loopCounter,data1);
      loopCounter++;
    }
    return 0;
}
已超过a
float
可存储的限制(IEEE-754单精度约7位)


在您的案例中,精度是有限的,这导致了您报告的“暂停”问题。换句话说,在某一点之后,adition没有任何实际效果(这会反映给用户)

我的意思是,新的和与前一个和非常接近,以至于它们的浮点重复是相同的,导致
data1
存储相同的值


在您的机器中,该值为2048,其余的所有增量加上一个小δ不会影响
data1

的浮点表示。对于任何浮点值,再加上一个(小得多的)增量,有一个值,从中加上增量会得到一个与前一个值“相似”的值,float中的表示形式相同

您的代码实际上是为找到该值而定制的

因此,虽然最初将delta添加到2000和以下几个值会导致可见的更改,但您的代码迟早(实际上很快)会达到特殊值。我假设你的情况是2048年。

2048.0
2048.0001
在浮点中没有不同的表示形式。因此,加法对变量没有影响。

你说的“暂停”是什么意思?它是停止还是继续打印相同的值?您知道浮点数据类型的精度限制吗?您的意思是它“停止”,因为它添加数据2而不更改数据1?你知道浮动的不精确性吗?您的代码非常适合找到特殊值,其中数据2非常小,其影响无法在累加器数据1中表示。
2000.0001
float
所能容纳的精度更高(~7位表示IEEE-754单精度)。您应该发布程序的准确输出,而不是说“it halt”之类的含糊不清的话(这到底意味着什么?)我已经理解了根本原因,但有人能告诉我如何在c代码中避免这种情况吗?根本不能,你只能使用更大的浮动来解决问题。但是,你可以在单独的问题中描述你真正想要实现的目标,展示你所拥有的(这与此不同)并寻求更具体的帮助。应用程序是电能表,我想存储kWh累积值,因此我使用float作为数据类型。我知道使用double作为数据类型,这个问题将得到解决。
 2000.0001