我有两个双向量。双的值在-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;
我担心双重不精确。
阅读这篇文章,一般来说是关于浮点数的。
请注意,如果您添加不同大小的值,如果顺序发生变化,结果会略有不同,那么它们将以不同的方式进行四舍五入。
不,它们不能保证是一样的。这里有一个简单的具体例子:
#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
假设通过以下方式求和,是否可以保证向量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范围。因此,任何方法都是可以接受的,因为我只将其用于调试。