小编ima*_*ett的帖子

为什么NaN - NaN == 0.0与英特尔C++编译器?

众所周知,NaNs在算术中传播,但我找不到任何演示,所以我写了一个小测试:

#include <limits>
#include <cstdio>

int main(int argc, char* argv[]) {
    float qNaN = std::numeric_limits<float>::quiet_NaN();

    float neg = -qNaN;

    float sub1 = 6.0f - qNaN;
    float sub2 = qNaN - 6.0f;
    float sub3 = qNaN - qNaN;

    float add1 = 6.0f + qNaN;
    float add2 = qNaN + qNaN;

    float div1 = 6.0f / qNaN;
    float div2 = qNaN / 6.0f;
    float div3 = qNaN / qNaN;

    float mul1 = 6.0f * qNaN;
    float mul2 = qNaN * qNaN;

    printf( …
Run Code Online (Sandbox Code Playgroud)

c c++ floating-point icc ieee-754

299
推荐指数
3
解决办法
3万
查看次数

禁用git EOL转换

我试图让git不改变任何操作的任何行结尾.不幸的是,似乎这样做并不重要.我已将其缩减为以下测试用例,该测试用例具有尽可能多的不同机制来禁用此行为.


  • 从两台机器开始(Windows计算机= A,Linux计算机= B)
  • 在两台机器上: git config --global core.autocrlf false
  • 在两台机器上:( git config --global core.eol crlf以防万一)

  • 在A上创建新存储库.从空文件夹:
    • git init --shared(然后取消隐藏创建的.git目录)
    • .gitignore在存储库中创建一个新文件
    • .gitattributes使用单行在存储库中创建一个新文件:* -text
    • git add .,然后git commit -m "initial commit"解决,例如这个.
    • git branch master_recv
    • 添加遥控器
  • document.txt在包含CRLF的存储库中创建一个新文件
  • 承诺:git add -A那么git commit -m "<something>"
  • 请注意,A document.txt仍然包含CRLF(并删除它并重置并--hard返回仍然使用CRLF的版本)

  • SCP整个目录到电脑B.
  • 添加new file包含CRLF 的新文件
  • 承诺:git add -A那么git commit -m "<something>"
  • 请注意,B document.txt和B …

git

77
推荐指数
5
解决办法
5万
查看次数

Python 2,3干净地将整数转换为"字节"

我找到的最短路:

n = 5

# Python 2.
s = str(n)
i = int(s)

# Python 3.
s = bytes(str(n), "ascii")
i = int(s)
Run Code Online (Sandbox Code Playgroud)

我特别关注两个因素:可读性和可移植性.对于Python 3,第二种方法很难看.但是,我认为它可能是向后兼容的.

我错过了一种更简洁,更清洁的方式吗?我目前使用一个新函数来创建一个lambda表达式来修复它,但也许这是不必要的.

python

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

为什么不是`std :: uniform_int_distribution <uint8_t>`和`std :: uniform_int_distribution <int8_t>`允许?

正如文件所说:

如果这不是一个的影响是不确定short,int,long,long long,unsigned short,unsigned int,unsigned long,或unsigned long long.

如果我不关心范围,我可以掩盖更大类型的位来生成随机数.如果没有,那就更复杂了.为什么默认情况下不提供字节类型?

c++ random c++11

23
推荐指数
1
解决办法
2311
查看次数

GLSL gl_FragCoord.z计算和设置gl_FragDepth

所以,我有一个冒名顶替者(真正的几何体是一个立方体,可能被修剪,冒名顶的几何体是Menger海绵),我需要计算它的深度.

我可以相当容易地计算出在世界空间中抵消的金额.不幸的是,我花了好几个小时没有用它来扰乱深度.

我能得到的唯一正确结果是我去的时候:

gl_FragDepth = gl_FragCoord.z
Run Code Online (Sandbox Code Playgroud)

基本上,我需要知道如何计算gl_FragCoord.z,以便我可以:

  • 从gl_FragCoord.z到眼睛空间进行逆变换
  • 添加深度扰动
  • 将这个扰动的深度转换回与原始gl_FragCoord.z相同的空间.

如果这似乎是一个重复的问题,我道歉; 这里有很多其他帖子可以解决类似问题.但是,在实现所有这些之后,没有一个正常工作.而不是试图选择一个来获得帮助,此时,我要求完整的代码来完成它.它应该只是几行.

opengl shader glsl

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

PHP数组语法分析错误左方括号"["

我有一个返回数组的函数.我有另一个函数只返回第一行,但由于某种原因,它使我使用一个中间变量,即失败:

function f1(/*some args*/) {
    return /*an array*/;
}
function f2(/*some args*/) {
    return f1(/*some args*/)[0];
}
Run Code Online (Sandbox Code Playgroud)

...有:

解析错误:语法错误,第10行的util.php中出现意外的'['

但是,这有效:

function f1(/*some args*/) {
    return /*an array*/;
}
function f2(/*some args*/) {
    $temp = f1(/*some args*/);
    return $temp[0];
}
Run Code Online (Sandbox Code Playgroud)

我无法在网上找到任何相关内容(我的搜索一直被"?","{","<"等人混淆.

我是用PHP自学成才的 - 有什么理由我不能直接这样做,我错过了吗?

php arrays reference function

14
推荐指数
1
解决办法
8817
查看次数

为什么内部*定义*不能使用他们的父类?

这是众所周知的,一个不能有一个会员你定义的类型:

class Foo {
    Foo member;
};
Run Code Online (Sandbox Code Playgroud)

原因是这是一个无限递归,无限大的对象.但是,我们可以拥有静态成员:

class Foo {
    static Foo member;
};
Run Code Online (Sandbox Code Playgroud)

我们可以这样做,因为Foo它就像一个命名空间; Foo不包含的实例.member,所以没有无限的引用.换句话说,.member属于类,而不属于实例.我想做的非常相似:

class Foo {
    class Bar {
        Foo member;
    };
};
Run Code Online (Sandbox Code Playgroud)

再次,Foo就像命名空间一样.实例Foo实际上是空的.我必须创建一个非静态字段Bar Foo::bar;来开始获取布局问题.不幸的是,我的编译器不同意(例如GCC):

<source>:3:14: error: field 'member' has incomplete type 'Foo'
Foo member;
^~~~~~
Run Code Online (Sandbox Code Playgroud)

出于什么技术原因这是不允许的?

c++

14
推荐指数
3
解决办法
793
查看次数

为什么空基类也是成员变量时禁止空基优化?

空基优化很棒。但是,它具有以下限制:

如果空基类之一也是第一个非静态数据成员的类型或类型的基类,则禁止空基类优化,因为相同类型的两个基子对象在对象表示中需要具有不同的地址派生最多的类型。

要解释此限制,请考虑以下代码。该static_assert会失败。而更改FooBar改为继承自Base2将避免错误:

#include <cstddef>

struct Base  {};
struct Base2 {};

struct Foo : Base {};

struct Bar : Base {
    Foo foo;
};

static_assert(offsetof(Bar,foo)==0,"Error!");
Run Code Online (Sandbox Code Playgroud)

我完全理解这种行为。我明白的是为什么存在这种特殊行为。很明显,添加它是有原因的,因为它是一个明确的添加,而不是一个疏忽。这样做的理由是什么?

特别是,为什么要要求两个基础子对象具有不同的地址?在上面,Bar是一个类型并且foo是该类型的成员变量。我不明白为什么基类对Bar类型的基类很重要,foo反之亦然。

事实上,如果有的话,我希望它&fooBar包含它的实例的地址相同——因为它需要在其他情况下(1)。毕竟,我对virtual继承并没有做任何花哨的事情,无论如何基类都是空的,并且编译Base2显示在这种特殊情况下没有任何问题。

但显然这种推理在某种程度上是不正确的,并且在其他情况下需要这种限制。

假设答案应该是针对 C++11 或更新版本的(我目前使用的是 C++17)。

(1)注意:EBO 在 C++11 中得到了升级,特别是对于StandardLayoutTypes 来说是强制性的(尽管Bar上面的 不是StandardLayoutType)。

c++ inheritance class memory-layout language-lawyer

14
推荐指数
1
解决办法
274
查看次数

前进的立方体歧义与前进的四面体

我已经成功实现了行进立方体算法.我使用标准材料作为参考,但我完全从头开始重写.它有效,但我观察到导致网格中的洞的模糊性.

我正在考虑行进的四面体算法,据说这种算法不会产生歧义.我看不出这是怎么可能的.

行进四面体算法使用六个四面体代替立方体,每个四面体具有三角剖分.但是,假设我要实现行进立方体算法,但对于256个三角测量中的每一个,只需选择多维数据集四面体三角剖分的"和"(并集)?据我所知,这就是行军四面体的作用 -那为什么会神奇地修复模糊性?

我认为有16个独特的案例,其他240个只是那些16的反思/轮换.我记得在某个地方阅读一些解决含糊之处的文章,你需要33个案例.这可能与为什么行进四面体不会出现问题有关?

所以,问题:

  1. 为什么行军四面体不会有歧义?
  2. 如果没有,为什么人们不使用行进立方体算法,而是使用四面体的三角剖分?

我觉得我在这里错过了一些东西.谢谢.

algorithm marching-cubes computational-geometry

12
推荐指数
2
解决办法
3953
查看次数

使用重载的普通新运算符放置新的

我有一个类型的对象MyType,出于SSE的原因,需要16字节对齐.所以,我写了一个分配器并重载了new运算符.方法MyType:

inline static void* operator new(size_t size) {
    awesome::my_allocator<MyType,16> alloc;
    return alloc.allocate(size);
}
inline static void* operator new[](size_t size) { return operator new(size); }
inline static void operator delete(void* ptr) {
    awesome::my_allocator<MyType,16> alloc;
    alloc.deallocate(reinterpret_cast<MyType*>(ptr),0); //last arg ignored in my impl
}
inline static void operator delete[](void* ptr) { operator delete(ptr); }
Run Code Online (Sandbox Code Playgroud)

现在,出于缓存局部性的原因,我需要将实例复制构造到特定的64字节对齐的内存中:

void MyType::copy_into(uint8_t* ptr) const {
    new (reinterpret_cast<MyType*>(ptr)) MyType(*this);
}
Run Code Online (Sandbox Code Playgroud)

GCC告诉我:

error: no matching function for call to ‘MyType::operator new(sizetype, MyType*)’
Run Code Online (Sandbox Code Playgroud)

ICC告诉我:

error …
Run Code Online (Sandbox Code Playgroud)

c++ new-operator

12
推荐指数
1
解决办法
1377
查看次数