c++检查浮点数

C++ checking floats

本文关键字:浮点数 检查 c++      更新时间:2023-10-16

对,我有一个浮点数数组,它只存储1和0。我只是试着做一个简单的测试/检查,当前槽在数组中是1,它会打印出一个小消息,说它是1,否则,它是0。下面是我的代码:

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

,但这只是继续进入"else"部分。即只打印"this is 0"。它怎么了(或者我怎么了?): P) ? ?

很棒的链接:每个计算机科学家都应该知道的浮点运算

阅读后,您将意识到1的浮点表示形式并不完全是整数值1。它很接近,但又不完全接近,这就是为什么你的条件总是为假的原因。

为什么要使用float s来存储布尔数据?

使用bool s数组或位向量。

编辑:我真的想不出任何情况下(或者为什么)你会把float s和字面上的比较,有人知道吗?

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

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

这应该让你了解发生了什么。

顺便说一下,如果您只在数组中存储值1.0f0.0f,那么使用==操作符比较浮点数是完全可以的。你只需要确定你认为的1.0,那就是真正的1.0

首先,不要使用float来存储10。没有理由使用float来存储小整数。

第二,你需要阅读《每个计算机科学家应该知道的关于浮点数的知识》。虽然它通常是有效的,但是您应该通过取它们之间差的绝对值来比较浮点值,并将与一些小的sigma(其中sigma是在有效精度范围内的应用程序中有意义的值)进行比较。

如果abs( x - y ) < sigma你可以认为它们是相等的

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

另一方面,在IEEE浮点数中,精确的0被存储为0x00000000。如果它不是计算的结果,那么在数组中添加一个0作为标志可以代替存储一个单独的数组。

可能有很好的理由使你的浮点数数组中的值偏离很小的分数而等于1。

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

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

我已经回答了一些关于这个的问题在这里。你不能用"=="来比较float和int。

在你的例子中,也许浮点数1实际上是0.9999999,它将被截断为0,这是你的程序的输出已经是正确的。

将数组元素强制转换为int:

if ((int)myArray[i] == 1)

或者将1转换为float:

if (myArray[i] == 1.0f)