C++ 当浮点数的值为';他被分配到一个长双人房?

C++ 当浮点数的值为';他被分配到一个长双人房?,c++,floating-point,double,C++,Floating Point,Double,编辑:我意识到我使用的是long double类型,而不仅仅是double,而确实起到了作用。我还在下面的程序中添加了一个示例,它再现了所讨论的错误 注意:我目前在C++11中工作,并使用GCC进行编译 我所处理的情况是,结果在以下两种计算之间变化: value1 = x * 6.0; 其中,上述所有变量均为long double类型 基本上,当我在实际计算中使用6.0时,我编写了一行代码,给出了错误的答案。然而,如果我先将6.0赋值给long double类型的变量,然后在计算中使用该变

编辑:我意识到我使用的是
long double
类型,而不仅仅是
double
,而确实起到了作用。我还在下面的程序中添加了一个示例,它再现了所讨论的错误

注意:我目前在C++11中工作,并使用GCC进行编译

我所处理的情况是,结果在以下两种计算之间变化:

value1 = x * 6.0;


其中,上述所有变量均为
long double
类型

基本上,当我在实际计算中使用6.0时,我编写了一行代码,给出了错误的答案。然而,如果我先将6.0赋值给long double类型的变量,然后在计算中使用该变量,我将得到正确的结果

我了解浮点运算的基本知识,我想很明显,当6.0的位被分配到长双精度类型时,它发生了一些事情

我实际程序中的样本(我将计算保持原样,以确保误差可再现):

此外,我了解浮点计算如何仅将精度保持在一定数量的位(因此设置如此高的精度不应影响结果,例如,在15-17位之后,如果数字发生变化,这应该非常重要,但不幸的是,这会影响我的计算)

问题:为什么上述两个代码段产生(稍微)不同的结果


注意:我不是简单地将这两个数字与
=
进行比较,然后接收
false
。我刚刚用setprecision打印出来,并检查每个数字。

我认为这里的问题是促销

在第二次计算中,我们注意到表达式中的每个项都是double类型。这意味着整个表达式的计算精度将提高一倍

但是,第一次计算包含变量
six
,该变量的类型为
long double
。这将导致整个表达式以长双精度的更高精度计算

因此,计算精度的差异可能是造成差异的原因。第一个表达式的整体提升为
long double
精度,但第二个计算仅计算为
double
精度

事实上,对代码进行简单的更改就可以证明这一点。如果我们通过写入
6.0L
将术语
6.0
的类型从
double
更改为
long double
,我们将得到相同的结果,因为现在两个表达式的计算精度相同:

value1 = (0.7854 * (pow(10, 5)) * six * (pow(0.033, 2)) * 1.01325 * (1.27 * 11.652375 / 1.01325 - 1.0));
value2 = (0.7854 * (pow(10, 5)) * 6.0L * (pow(0.033, 2)) * 1.01325 * (1.27 * 11.652375 / 1.01325 - 1.0));

6.0已经是一种
double
类型。即使只有double或float,你也不应该依赖
3.0+3.0==6.0
@PaulWarnick我收回了我的重复投票,因为我明白了你的真正要求。然而,我无法复制,你能提供一个有效的例子吗?@PaulWarnick你能尝试将文字设置为长双精度(即6.0L)吗?我找不到重复的文字(我确信一定有),所以我提供了一个答案。我认为最重要的是总是提供一个重现错误的工作示例。那么你就不会出错:)
value1 != value2
#include <iomanip>
#include <math.h>

long double six = 6.0;
long double value1;
long double value2;

value1 = (0.7854 * (pow(10, 5)) * six * (pow(0.033, 2)) * 1.01325 * (1.27 * 11.652375 / 1.01325 - 1.0));
value2 = (0.7854 * (pow(10, 5)) * 6.0 * (pow(0.033, 2)) * 1.01325 * (1.27 * 11.652375 / 1.01325 - 1.0));

std::cout << std::setprecision(25) << value1 << std::endl;
std::cout << std::setprecision(25) << value2 << std::endl;
7074.327896870849993415931
7074.327896870850054256152
long double six = 6.0;
long double value1;
long double value2;

value1 = (0.7854 * (pow(10, 5)) * six * (pow(0.033, 2)) * 1.01325 * (1.27 * 11.652375 / 1.01325 - 1.0));
value2 = (0.7854 * (pow(10, 5)) * 6.0 * (pow(0.033, 2)) * 1.01325 * (1.27 * 11.652375 / 1.01325 - 1.0));
value1 = (0.7854 * (pow(10, 5)) * six * (pow(0.033, 2)) * 1.01325 * (1.27 * 11.652375 / 1.01325 - 1.0));
value2 = (0.7854 * (pow(10, 5)) * 6.0L * (pow(0.033, 2)) * 1.01325 * (1.27 * 11.652375 / 1.01325 - 1.0));