小编Jar*_*sie的帖子

C++:双精度,精度,虚拟机和GCC

我有以下代码:

#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

21
推荐指数
2
解决办法
1416
查看次数

基于OpenGL的简单相机类

我正在寻找一个简单但完整的OpenGL相机实现(库).我的用例是渲染体积模型 - 我用过剩的可视化.但我目前的相机实现有点儿麻烦.

谷歌搜索后,我发现了一些实现,如在NeHe中找到的那些,但是他们没有我追求的所有功能,具体来说:

  1. 左右
  2. 扫射
  3. 绕观察轴旋转
  4. 任意翻译观点

任何可以轻松转换为OpenGL的DirectX解决方案也将受到赞赏.

c++ opengl camera open-source

6
推荐指数
1
解决办法
1万
查看次数

中位数算法理解中位数

我在网上搜索并访问了wiki页面,找到了中位数算法的中位数.但似乎无法在我的问题中找到明确的陈述:

如果一个人拥有一个非常大的整数列表(TB的大小),并希望以分布式方式找到该列表的中位数,那么会将列表分成不同大小的子列表(或者相等并不重要),然后继续计算那些较小的子列表的中位数,然后计算这些中位数的中位数得到原始大型列表的中位数?

此外,这个陈述也适用于任何第k个统计数据吗?我对这个领域的研究等方面感兴趣.

algorithm complexity-theory computer-science median-of-medians

4
推荐指数
2
解决办法
897
查看次数

C++ 11 lambda和模板专业化

我想知道下面给出的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)

c++ lambda templates c++11

3
推荐指数
2
解决办法
2697
查看次数

如何将C++ lambda调整为接收器接口,例如back_inserter等

我想知道是否可以在不必定义额外类的情况下,如果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++巫术可以提供上述内容而无需提供额外的中间类?

c++ lambda adapter

2
推荐指数
1
解决办法
531
查看次数

从文本文件中选择K个随机行

这是从X行文本中选择随机行的原始问题的扩展,其中所选文本行的概率是1/X. 诀窍是如果查询范围为[0,1)的随机变量Y,则选择第J行,并返回小于1/J的值.

现在在这个问题的新版本中,我们必须选择K小于X的K随机线.我相信每条线的概率应该是K/X.

我坚持如何将原始解决方案扩展到K线.可能吗?任何解释都会很棒.

c++ algorithm random-sample

2
推荐指数
1
解决办法
673
查看次数

使用C++中的宏生成函数

我有以下宏用于在当前作用域或命名空间中生成函数:

#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)

c++ macros templates function

2
推荐指数
1
解决办法
2632
查看次数