浮点和双常数比较
float and double constant comparing
来源http://www.cprogramming.com/tips/tip/difference-between-float-and-double:
在c++中,任何类似4.12的值默认情况下都被视为双精度。由于导致微小误差的精度差异。例如:
float a = 4.12;
if(a == 4.12)
{
cout << "hello";
}
else
{
cout << "bye";
}
这将显示输出为"再见4.12"
为什么?
因为默认情况下4.12是一个双精度(例如在if语句或在对变量的赋值中),但将其存储在浮点中会丢失一定的精度,因此进行比较,然后将double与float进行比较导致数字精度的微小变化——记住浮球和双打并不精确。
这里有两个教训:一个是大多数时候不应该直接比较浮点数,另一个是硬编码浮点数的默认大小和类型是双倍的。
问题是"不应该比较浮点变量和双常量"。
所以我的问题是,比较浮点变量和后面跟着"f"的浮点常量可以吗?
像这样的东西。
if(a == 4.12f)
比较float变量和后面跟着"f"的float常量可以吗?
它仍然很危险。与float
/double
的例子不同,a
的每一个可能值都可能失败,实际上a
中有一个值的a == 4.12f
将是true
,但根据您设置a
的方式,即使您希望它与4.12f
匹配,它也可能不匹配。例如:
#include <iostream>
#include <iomanip>
int main()
{
float f = 4.14;
f -= 0.01;
f -= 0.01;
std::cout << std::boolalpha << (f == 4.12f) << 'n';
}
在ideone.com上,这里输出:
false
本标准确实保证在某些情况下会使用最接近的表示,因此,如果您直接指定float a = 4.12f;
,那么之后的a == 4.12f
必然是true
,并且§26.5.1.4保证,如果您流式传输a
并将文本流式传输回另一个float
,那么之后它们将比较相等。
无论如何,如果你觉得你必须依赖这样的东西,请查看Standard/docs以了解你正在考虑的具体用法。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么比较运算符如此快速
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 比较字符数组
- 将模板化的类型与C++中的某些类/类型进行比较
- C++自定义比较函数
- 如何比较自定义类的std::变体
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- std::设置自定义比较器
- 布尔比较运算符是如何在C++中工作的
- C++将目录中的所有文件与::filesystem进行比较
- shell排序中的交换和比较
- 如何在C++中比较两个char数组
- catch框架有没有办法比较流或文件
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 智能指针作为无序映射键,并通过引用进行比较
- 基于整数常数比较的模板专业化
- 将模板类型与常数数值值进行比较
- 浮点和双常数比较
- 特定积分常数的重载比较