我有以下代码:
#include <cstdio>
int main()
{
if ((1.0 + 0.1) != (1.0 + 0.1))
printf("not equal\n");
else
printf("equal\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当使用gcc(4.4,4.5和4.6)使用O3编译并本机运行(ubuntu 10.10)时,它会打印预期的"相等"结果.
但是,当如上所述编译并在虚拟机(ubuntu 10.10,virtualbox image)上运行时,它输出"不相等"的情况下相同的代码 - 这是O3和O2标志设置但不是O1及以下时的情况.当使用clang(O3和O2)编译并在虚拟机上运行时,我得到了正确的结果.
我理解1.1无法使用double正确表示,我读过"每个计算机科学家应该知道浮点算术的内容"所以请不要指向我那里,这似乎是GCC做的某种优化不知何故似乎在虚拟机中不起作用.
有任何想法吗?
注意:C++标准说在这种情况下类型提升是依赖于实现的,可能是GCC使用更精确的内部表示,当应用不等式测试时,它是否成立 - 由于额外的精度?
UPDATE1:以上修改上面的代码,现在得到了正确的结果.在某些时候,无论出于何种原因,GCC都会关闭浮点控制字.
#include <cstdio>
void set_dpfpu() { unsigned int mode = 0x27F; asm ("fldcw %0" : : "m" (*&mode));
int main()
{
set_dpfpu();
if ((1.0 + 0.1) != (1.0 + 0.1))
printf("not equal\n");
else
printf("equal\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
UPDATE2:对于那些询问代码的const表达性质的人,我已经改变了如下,并且在使用GCC编译时仍然失败. - 但我认为优化器也可能将以下内容转换为const表达式.
#include <cstdio>
void …Run Code Online (Sandbox Code Playgroud) c++ compiler-construction optimization double-precision vm-implementation
我正在寻找一个简单但完整的OpenGL相机实现(库).我的用例是渲染体积模型 - 我用过剩的可视化.但我目前的相机实现有点儿麻烦.
谷歌搜索后,我发现了一些实现,如在NeHe中找到的那些,但是他们没有我追求的所有功能,具体来说:
任何可以轻松转换为OpenGL的DirectX解决方案也将受到赞赏.
我在网上搜索并访问了wiki页面,找到了中位数算法的中位数.但似乎无法在我的问题中找到明确的陈述:
如果一个人拥有一个非常大的整数列表(TB的大小),并希望以分布式方式找到该列表的中位数,那么会将列表分成不同大小的子列表(或者相等并不重要),然后继续计算那些较小的子列表的中位数,然后计算这些中位数的中位数得到原始大型列表的中位数?
此外,这个陈述也适用于任何第k个统计数据吗?我对这个领域的研究等方面感兴趣.
algorithm complexity-theory computer-science median-of-medians
我想知道下面给出的lambda的正确类型定义是什么,以便下面的代码将使用符合条件的c ++ 11编译器进行编译:
#include <cstdio>
#include <string>
template<class Func>
class foo
{
public:
foo(Func func)
: fum(func){}
Func fum;
};
int main()
{
foo<???> fi([](int i) -> bool { printf("%d",i); return true; });
fi.fum(2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想另一种可以做到的方式是这样的:
template<typename Func>
foo<Func> make_foo(Func f)
{
return foo<Func>(f);
}
int main()
{
auto fi = make([](int i) -> bool { printf("%d",i); return true; });
fi.fum(2);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我想知道是否可以在不必定义额外类的情况下,如果lambda可以适合作为接收器.
例如,我们目前可以执行以下操作:
std::vector<int> ilst;
std::copy(ilst.begin(),ilst.end(),std::ostream_iterator<int>(std::cout,"\n"));
Run Code Online (Sandbox Code Playgroud)
如果可能出现以下内容怎么办?显然以下不会编译atm:
std::copy(ilst.begin(),ilst.end(),
[](const int& i)
{
std::cout << i << "\n";
});
Run Code Online (Sandbox Code Playgroud)
通过定义实现解除引用和函数运算符的函数对象并将lambda作为谓词,我已经能够解决这个问题.
但是我想知道是否有某种C++巫术可以提供上述内容而无需提供额外的中间类?
这是从X行文本中选择随机行的原始问题的扩展,其中所选文本行的概率是1/X. 诀窍是如果查询范围为[0,1)的随机变量Y,则选择第J行,并返回小于1/J的值.
现在在这个问题的新版本中,我们必须选择K小于X的K随机线.我相信每条线的概率应该是K/X.
我坚持如何将原始解决方案扩展到K线.可能吗?任何解释都会很棒.
我有以下宏用于在当前作用域或命名空间中生成函数:
#define MAKE_FUNC(FNAME) \
template <typename T> \
T ##FNAME## (const T& t) \
{\
return t; \
}
MAKE_FUNC(foo)
MAKE_FUNC(boo)
int main()
{
foo(1);
boo(2);
}
Run Code Online (Sandbox Code Playgroud)
以下是编译上述代码时的错误消息:
prog.cpp:8:1: error: pasting "Tfoo" and "(" does not give a valid preprocessing token
prog.cpp:9:1: error: pasting "Tboo" and "(" does not give a valid preprocessing token
prog.cpp:8: error: ISO C++ forbids declaration of ‘Tfoo’ with no type
prog.cpp:9: error: ISO C++ forbids declaration of ‘Tboo’ with no type
prog.cpp: In function ‘int …Run Code Online (Sandbox Code Playgroud)