c - 不同的结果对相同的和(C语言)(四舍五入问题)
问题描述
好吧,我正在尝试使用两种不同的方法对向量求和。结果应该是相同的,但不会发生。
方法一:对向量进行线性求和;
方法二:向量两部分相加;
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(void){
int i,n;
double a,b,c;
a=0;
b=0;
c=0;
n=1000000;
//Initialization
double vec[n];
for(i=0;i<n;i++)
{
vec[i]=1.0001;
}
//Sum Method 1
for(i=0;i<n;i++)
{
a+=vec[i];
}
//Sum Method 2
for(i=0;i<n/2;i++)
{
b+=vec[i];
}
for(i=n/2;i<n;i++)
{
c+=vec[i];
}
b=c+b;
//------------------------------------
printf("Method 1: %.30f\n",a);
printf("Method 2: %.30f\n",b);
return 0;
}
输出是:
Method 1: 1000099.999976676190271973609924316406
Method 2: 1000100.000003988854587078094482421875
有没有办法解决这个问题?
解决方案
浮点加法不是关联的。在第一个中,您加起来如下:(((x1 + x2) + x3) + x4)。而在第二个像(x1 + x2)+(x3 + x4)。
推荐阅读
- javascript - 使用 Sublime 重新缩进缩小的 Javascript
- linux - 为 SIGSEGV 注册信号处理程序并且仍然能够从操作系统创建完整的故障转储
- python - 在情节中自定义带有和不带标签的刻度
- java - atlassian jira 密码编码
- php - laravel 命令 php artisan make:model 运行命令文件夹中的所有命令
- reactjs - 在 Typescript 中的另一个 thunk 函数中执行 thunk 函数
- azure-devops - 如何从另一个项目中的另一个管道启动 Azure 管道?
- laravel - Laravel 升级到版本 8 抛出错误
- excel - 从超过 10 列的多列 ListBox 中的工作表的第一行填充标题文本
- spring-boot - 如何模拟存储库,使其不插入或从数据库中提取数据