C++ C++;检查浮动
对,我有一个浮点数数组,它只存储1和0。我试着做一个简单的测试/检查数组中的当前插槽是否为1,它会打印出一条小消息,表示为1,否则为0。这是我的密码: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。没有理由使用浮点存储小整数 第二,您
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