在C ++中,我是否有保证,对于任何给定的float a
和float b
,a < b
,a == b
和a > b
中只有一个// named-reference.cpp
// Compile with: /EHsc
#include <iostream>
using namespace std;
// A class that contains a memory resource.
class MemoryBlock
{
// TODO: Add resources for the class here.
};
void g(const MemoryBlock&)
{
cout << "In g(const MemoryBlock&)." << endl;
}
void g(MemoryBlock&&)
{
cout << "In g(MemoryBlock&&)." << endl;
}
MemoryBlock&& f(MemoryBlock&& block)
{
g(block);
return block;
}
int main()
{
g(f(MemoryBlock()));
}
是真的吗?
如果编译器和平台之间存在差异,我对x86上的Visual C ++感兴趣。
答案 0 :(得分:76)
没有
对于a
,b
和NaN
中的每一个,a < b
或a == b
为a > b
都是假的。< / p>
如果a
和b
都是非NaN,那么a < b
,a == b
或a > b
中只有一个必须为真。
作为补充,这个answer告诉你如何在C ++中获得 a NaN值(有几个NaN值,可以通过检查它们的表示来区分;它们都是不同的彼此因为NaN永远不等于任何东西,以及如何测试一个值是否是NaN(一个惯用的测试,看看变量x
是否是NaN是x != x
,而且确实{ {1}}通常以这种方式实现,但是一些必须阅读代码的程序员可能会对它感到困惑。)
然后,如果std::isnan()
和a
是先前计算的结果,则存在精度过高的问题。有关C中的讨论,请参阅此article .C99标准通过明确规定过多精度可能发生和不可能发生的情况来解决问题,但尽管C ++或多或少地继承了这些规则,但仍遵循C标准。在b
中定义FLT_EVAL_METHOD
,实际上C编译器比C ++编译器更严肃地对待规则。例如,GCC在使用cfloat
进行编译时实现C的规则,在此上下文中,您可以依赖该属性来保留,但在撰写本文时,GCC在用作C ++编译器时不会实现这些规则。