当前位置: 首页 > 知识库问答 >
问题:

C:a b C总是等于C b a吗?假设a、b、c是双[重复]

鲜于宏义
2023-03-14

我有两个双向量。双的值在-1000到1000之间。

两个向量包含相同的数字,但顺序不同。

例如

Vector1 = {0.1, 0.2, 0.3, 0.4};
Vector2 = {0.4, 0.2, 0.1, 0.3};

假设通过以下方式求和,是否可以保证向量1的和与向量2的和完全相等:

double Sum = 0;
for (double Val : Vector) Sum += Val;

我担心双重不精确。

共有3个答案

颜安宁
2023-03-14

阅读这篇文章,一般来说是关于浮点数的。

请注意,如果您添加不同大小的值,如果顺序发生变化,结果会略有不同,那么它们将以不同的方式进行四舍五入。

张建树
2023-03-14

不,它们不能保证是一样的。这里有一个简单的具体例子:

#include <stdio.h>

int main(void) {
    double x =  504.4883585687764;
    double y = 29.585946026264367;
    double z =   2.91427392498775;

    double lhs = x + (y + z);
    double rhs = z + (y + x);

    printf("LHS  : %5.30g\n", lhs);
    printf("RHS  : %5.30g\n", rhs);
    printf("Equal: %s\n", lhs == rhs ? "yes" : "no");
    return 0;
};

运行时,将生成:

LHS  : 536.988578520028568163979798555
RHS  : 536.988578520028454477142076939
Equal: no
太叔昆
2023-03-14

假设通过以下方式求和,是否可以保证向量1的和与向量2的和完全相等:

不,C语言中没有这样的保证。

事实上,有一个间接的实际保证——假设典型的浮点实现——结果是不相等的。(但是编译器有办法禁用这种保证,并启用可能导致总和相等的不安全浮点优化)。

对于给定的输入,差异可能非常小,但对于其他输入,差异可能非常大。

 类似资料:
  • 我正在读费多尔·皮库斯的这本书,他有一些非常非常有趣的例子,对我来说是一个惊喜。 特别是这个基准抓住了我,唯一的区别是,在其中一个基准中,我们在if中使用||,在另一个基准中,我们使用|. 我不会详细介绍书中解释的为什么后者更快的所有细节,但我的想法是,在较慢的版本和|(按位或)版本中,硬件分支预测器有两次错误预测的机会。请参见下面的基准测试结果。 所以问题是为什么我们不在分支中总是使用|而不是|

  • 然而,今天我在处理一些代码时,意外地发现以下两个交换给出了不同的结果: 这让我难以置信。有人能给我解释一下这里发生了什么吗?

  • 问题内容: 我今天偶然地写了一些代码,当Eclipse一次不对我大吼时,我感到很惊讶。该代码对结构相等运算符()有双重使用,类似于下面的结构。 输出是 玩耍时,我注意到我除了不能使用任何类型。从这个布尔表达式是 简化为。 因此,忽略副作用等于。 谁能解释该语法如何暗示这一点? 编辑1: 在许多人解释了左联想性之后,我发现我的困惑在哪里。通常,我将“ 1”表示为true,将“ 0”表示为false,

  • 问题内容: 我尝试了一些代码,使用XOR在Java中交换两个整数而不使用第三个变量。 这是我尝试的两个交换函数: 这段代码产生的输出是这样的: 我很好奇,为什么这样说: 与这个不同吗? 问题答案: 问题是评估的顺序: 参见JLS第15.26.2节 首先,对左操作数求值以产生一个变量。 如果该评估突然完成,则赋值表达式由于相同的原因而突然完成;右边的操作数不会被评估,并且不会发生赋值。 否则,将保存

  • 我尝试了一些代码在Java中交换两个整数,而不使用第三个变量,即使用XOR。 以下是我尝试的两个交换函数: 该代码产生的输出如下: 我很想知道,为什么会有这样的说法: 和这个不一样?

  • 我有两个数字:A和B。我需要在我的代码中的某个地方计算A B。A和B都是长的,可以是正的,也可以是负的。 我的代码运行错误,我怀疑问题发生在计算A B时。我只想检查A B是否超过了long long范围。因此,任何方法都是可以接受的,因为我只将其用于调试。