c++检查浮点数
C++ checking floats
对,我有一个浮点数数组,它只存储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.0f
和0.0f
,那么使用==
操作符比较浮点数是完全可以的。你只需要确定你认为的是1.0
,那就是真正的1.0
。
首先,不要使用float来存储1
或0
。没有理由使用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)
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 在打印浮点数之前检查浮点数是否为偶数
- 我如何检查 - 并使用 fmod(浮点数)获取余数
- 怪异的方法来检查浮点数是否为负
- 如何获取模板的类型,如模板<类型名 T>,并检查 T 是 int 还是浮点数或类
- 如何静态检查模板的类型 T 是否为 std::vector<U>,其中 U 是浮点数、双精度数或积分
- 在c++中有效检查浮点数组中的值变化
- 如何在C++中启用浮点数的运行时检查
- 如何检查条目是否是包括浮点数的数字
- C++ 仅使用 #iostream 检查输入是否为浮点数
- 在VC ++浮点数据类型值中,如何检查字符串或特殊字符是否混合
- 如何检查输入的数字是否为整数不是浮点数
- c++检查浮点数
- 如何检查浮点数是否为整数
- 检查整个输入是否是浮点数
- 如何检查一个巨大的浮点数是否为整数