Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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
C++ C++;检查浮动_C++_Arrays_If Statement_Floating Point - Fatal编程技术网

C++ C++;检查浮动

C++ C++;检查浮动,c++,arrays,if-statement,floating-point,C++,Arrays,If Statement,Floating Point,对,我有一个浮点数数组,它只存储1和0。我试着做一个简单的测试/检查数组中的当前插槽是否为1,它会打印出一条小消息,表示为1,否则为0。这是我的密码: if(myArray[i] == 1) { cout << "this is 1 !!!!!" << endl; } else { cout << "this is 0 "; } if(myArray[i]==1) { cout首先,不要使用浮点存储1或0。没有理由使用浮点存储小整数 第二,您

对,我有一个浮点数数组,它只存储1和0。我试着做一个简单的测试/检查数组中的当前插槽是否为1,它会打印出一条小消息,表示为1,否则为0。这是我的密码:

if(myArray[i] == 1)
{
    cout << "this is 1 !!!!!" << endl;
}
else
{
    cout << "this is 0 ";
}
if(myArray[i]==1)
{

cout首先,不要使用浮点存储
1
0
。没有理由使用
浮点存储小整数

第二,您需要了解虽然它通常会起作用,但您应该通过获取浮点值之间差值的绝对值并将其与一些小的sigma(其中sigma是在有效精度范围内对应用程序有意义的值)进行比较来比较浮点值


<> >代码> ABS(X-Y)< Sigma < /C> >您可以认为它们是相等的。

< P>首先,不要使用浮点来存储<代码> 1 < /代码>或< <代码> 0 > /代码>。没有理由使用<代码>浮点< /代码>来存储小整数。

第二,您需要了解虽然它通常会起作用,但您应该通过获取浮点值之间差值的绝对值并将其与一些小的sigma(其中sigma是在有效精度范围内对应用程序有意义的值)进行比较来比较浮点值

< > <代码> ABS(X-Y)< sigma < /代码>,你可以认为它们是相等的。

< P>大链接:

阅读后,你会意识到1的浮点表示法不是整数值1。它很接近,但不完全,这就是为什么你的条件总是错误的

为什么要使用
float
s来存储布尔数据?请使用
bool
s数组或位向量

编辑:我想不出任何情况下(或为什么)你会将
float
s与文字进行比较,有人知道吗?

很好的链接:

阅读后,你会意识到1的浮点表示法不是整数值1。它很接近,但不完全,这就是为什么你的条件总是错误的

为什么要使用
float
s来存储布尔数据?请使用
bool
s数组或位向量


编辑:我想不出任何情况下(或为什么)你会将
float
s与文字进行比较,有人知道吗?

或者将数组元素强制转换为
int

if ((int)myArray[i] == 1)
或将
1
强制转换为
浮点值

if (myArray[i] == 1.0f)

将数组元素强制转换为
int

if ((int)myArray[i] == 1)
或将
1
强制转换为
浮点值

if (myArray[i] == 1.0f)

根据数组中的值(即计算结果)的计算方式,不太可能得到精确的0或1作为浮点结果。在这种情况下,检查float==1是否精确几乎肯定是错误的


另一方面,在IEEE浮点运算中,精确的0存储为0x00000000。如果它不是计算结果,则在数组中粘贴0可以用作标志,而不是存储单独的数组。

取决于数组中的值是如何获得的(即计算结果),不太可能得到精确的0或1作为浮点结果。在这种情况下,检查float==1是否精确几乎肯定是错误的


另一方面,在IEEE浮点运算中,精确的0存储为0x00000000。如果它不是计算结果,则在数组中粘贴0可以用作标志,而不是存储单独的数组。

浮点数组中的值有很好的理由被关断非常小的分数,等于1

虽然这不是一个干净的解决方案,但这应该是使用enum或bool数组的充分理由

if(myArray[i] > 0.9f && myArray[i] < 1.00001f)
...
...
if(myArray[i]>0.9f&&myArray[i]<1.00001f)
...
...

浮点数组中的值有一个很好的理由,它的值被非常小的分数关闭,等于1

虽然这不是一个干净的解决方案,但这应该是使用enum或bool数组的充分理由

if(myArray[i] > 0.9f && myArray[i] < 1.00001f)
...
...
if(myArray[i]>0.9f&&myArray[i]<1.00001f)
...
...

当使用浮点数操作时,您应该编写更具防御性的程序:

if (myArray[i] == 1) {
  cout << "this is 1\n";
} else if (myArray[i] == 0) {
  cout << "this is 0\n";
} else {
  cout << "this is something else, in particular " << myArray[i] << "\n";
}
if(myArray[i]==1){

cout当使用浮点数操作时,您应该编写更具防御性的程序:

if (myArray[i] == 1) {
  cout << "this is 1\n";
} else if (myArray[i] == 0) {
  cout << "this is 0\n";
} else {
  cout << "this is something else, in particular " << myArray[i] << "\n";
}
if(myArray[i]==1){

cout原因是浮点数不可能精确表示1。这就是为什么您的if条件永远无法满足的原因。检查1的唯一方法是确定阈值并测试浮点数是否足够接近:

const float threshold = 0.0001f;
if( fabs( myArray[ i ] - 1.0f ) < threshold )
{
 ...do whatever...
} 
const float threshold=0.0001f;
if(晶圆厂(myArray[i]-1.0f)<阈值)
{
…做任何事。。。
} 

当然,如果只对整数进行测试,那么另一种方法就是使用整数,这将是更明智的选择。

原因是浮点不可能准确表示1。这就是为什么if条件永远不能满足的原因。检查1的唯一方法是确定阈值并测试浮点是否为1值变得足够接近:

const float threshold = 0.0001f;
if( fabs( myArray[ i ] - 1.0f ) < threshold )
{
 ...do whatever...
} 
const float threshold=0.0001f;
if(晶圆厂(myArray[i]-1.0f)<阈值)
{
…做任何事。。。
} 

当然,如果只针对整数进行测试,那么另一种方法就是使用int,这将是更明智的选择。

我已经回答了一些有关这方面的问题 .您不能使用“==”来比较浮点和整数


在您的例子中,可能float 1实际上是0.9999999,它将被截断为0,这是您的程序的输出已经是正确的。

我已经回答了一些关于这方面的问题 .您不能使用“==”来比较浮点和整数


在您的情况下,可能浮点1实际上是0.9999999,它将被截断为0,这是您的程序的输出已经正确。

这里的信息太少。我们需要查看数组中的内容。编辑:是的,这是一个糟糕的设计。现在顶部的答案有点不正确。B