在最新的C++标准中,我注意到以下宏:
bool isgreater(float x, float y);
bool isgreaterequal(float x, float y);
bool isless(float x, float y);
bool islessequal(float x, float y);
bool islessgreater(float x, float y);
bool isunordered(float x, float y);
Run Code Online (Sandbox Code Playgroud)
这些宏来自C(7.12.14和7.12.14).
那么,为什么有人会使用这些宏而不是运算符呢?这些宏正在做什么特别的事情(比如检查inf),或者它们是否与它们相应的运算符相同?
C++示例:
#include <iostream>
#include <cmath>
int main()
{
float x=0.2;
float y=0.5;
std::cout << x << " < " << y << " : " << std::boolalpha << std::islessequal( x, y ) << std::endl;
std::cout << x << " < " << y << " …Run Code Online (Sandbox Code Playgroud) 下面的代码应该找到问题的关键3.0在std::map其是否存在.但由于浮点精度,它将无法找到.
map<double, double> mymap;
mymap[3.0] = 1.0;
double t = 0.0;
for(int i = 0; i < 31; i++)
{
t += 0.1;
bool contains = (mymap.count(t) > 0);
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,contains将永远是false.我目前的解决方法是乘以t0.1而不是加0.1,如下所示:
for(int i = 0; i < 31; i++)
{
t = 0.1 * i;
bool contains = (mymap.count(t) > 0);
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是:
有没有办法将ifCompare引入std::mapif if use double键?浮点数比较的常见解决方案通常是这样的a-b < epsilon.但我没有看到这样做的简单方法std::map.我是否真的必须在double类中封装类型并覆盖operator<(...)以实现此功能?
考虑C++中有序和无序的关联容器double.
是NaN有效的密钥类型吗?
对于有序的容器,我应该说"不",因为它不尊重严格的弱排序.
对于无序容器,我不知道.
以下是GCC 4.6.2中发生的情况:
#include <map>
#include <unordered_map>
#include <cmath>
#include <iostream>
#include <prettyprint.hpp>
int main()
{
typedef std::map<double, int> map_type; // replace by "unorderd_map"
map_type dm;
double d = std::acos(5); // a good nan
dm[d] = 2;
dm[d] = 5;
dm[d] = 7;
std::cout << "dm[NaN] = " << dm[d] << ", dm = " << dm << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
对于有序地图,我得到:
dm[NaN] = 7, dm = [(nan, 7)]
Run Code Online (Sandbox Code Playgroud)
对于无序地图,我得到:
dm[NaN] = 0, dm …Run Code Online (Sandbox Code Playgroud)