我发现了一个影响我工作中的多个单元测试的问题,这种问题仅在使用 valgrind 运行单元测试时才会发生,因为对于相同的输入,从 std::cos 和 std::sin 返回的值是不同的,具体取决于是否单元测试是独立运行的,而不是在 valgrind 下运行。
这个问题似乎只发生在某些特定的输入上,因为许多单元测试都通过了相同的代码。
这是一个最低限度可重现的示例(稍微恶化,以便我的编译器不会优化任何逻辑):
#include <complex>
#include <iomanip>
#include <iostream>
int main()
{
std::complex<long double> input(0,0), output(0,0);
input = std::complex<long double>(39.21460183660255L, -40);
std::cout << "input: " << std::setprecision(20) << input << std::endl;
output = std::cos(input);
std::cout << "output: " << std::setprecision(20) << output << std::endl;
if (std::abs(output) < 5.0)
{
std::cout << "TEST FAIL" << std::endl;
return 1;
}
std::cout << "TEST PASS" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正常运行时输出:
input: (39.21460183660254728,-40)
output: (6505830161375283.1118,117512680740825220.91) …Run Code Online (Sandbox Code Playgroud) 我这里有一个奇怪的问题.
我正在开发一个应用程序,在我的一个类中,我正在监视我的鼠标事件.
奇怪的是,如果按下任何鼠标按钮,我的鼠标移动事件将被调用.
我甚至没有过滤方法中的任何按钮按下; 除非我点击这个对象本身(正在监视它的对象),否则该方法本身甚至不会被调用.
通常会导致此类错误发生的原因是什么?
我不确定它是否相关,但我有两个不同的东西监视我的鼠标输入:1)主程序监视全局鼠标坐标,2)我的程序中的一个对象监视自身内的鼠标坐标.
编辑 所以问题必须是因为当人们沿着屏幕向右拖动光标时,通常会使用鼠标移动事件?我不需要它的原因是因为我正在构建各种自定义上下文菜单,我需要知道项目何时悬停.
我正在尝试从使用英特尔 OneAPI 工具包中的经典英特尔编译器切换到下一代 DPC/C++ 编译器,但处理浮点运算的默认行为似乎已损坏或不同,因为comparison with infinity always evaluates to false in fast floating point modes. 以上既是编译器警告,也是我现在在 ICX 中遇到的行为,但不是经典编译器中遇到的行为(对于使用相同的最小编译器标志集)。
#include <iostream>
#include <cmath>
int main()
{
double a = 1.0/0.0;
if (std::isinf(a))
std::cout << "is infinite";
else
std::cout << "is not infinite;";
}
Run Code Online (Sandbox Code Playgroud)
编译器标志:
-O3 -Wall -fp-model=fast
ICC 2021.5.0 输出:(
is infinite
也在几个旧版本上进行了测试)
ICX 2022.0.0 输出:(
is not infinite
也在 2022.0.1 上测试)
编译器浏览器上的现场演示: https: //godbolt.org/z/vzeYj1Wa3
默认情况下-fp-model=fast在两个编译器上都启用。如果我手动指定,-fp-model=precise我可以恢复行为,但不能恢复性能。
有谁知道使用下一代编译器保持快速浮点模型之前的行为和性能的潜在解决方案?
为了避免在执行旋转时发生角度锁定,我尝试切换到四元数。不知何故,我仍然设法达到云台锁定。
我不确定是否是由于实施的数学方法或设计错误引起的,所以请指出是否应该更改对象坐标的方法。
我的每个对象都有一个X,Y,Z值和一个俯仰,偏航,横滚值。当我更改旋转值时,对象将根据以上信息重新计算其顶点。此逻辑如下:
// vertex array
vertices[x] -= /*Offset by origin point*/;
// Quat.'s representing rotation around xyz axes
Quaternion q1 = Quaternion(glm::vec3(1,0,0),pitch);
Quaternion q2 = Quaternion(glm::vec3(0,1,0),yaw);
Quaternion q3 = Quaternion(glm::vec3(0,0,1),roll);
// total rotation
Quaternion TotalRot = ( (q3 * q2) * (q1) );
// conversion of original coordinates to quaternion
Quaternion Point1 = Quaternion(0, vertices[x].x(), vertices[x].y(), vertices[x].z());
// resulting rotated point
Quaternion Point2 = Quaternion( (TotalRot * Point1) * TotalRot.inverse() );
// placing new point back into vertices array …Run Code Online (Sandbox Code Playgroud) 当对象名称,信号和插槽都在文本文件中指定时,如何连接2个对象的信号和插槽?
获取正确的对象名称不是问题,因为我可以轻松地遍历数组并将名称与文件中的位置进行比较,但必须有某种方式可以从文件中返回信号和插槽并在connect函数中使用它,如:
connect(rtnObj1(line),SIGNAL(rtnSignal(line)),rtnObj2(line),SLOT(rtnSlot(line)));
Run Code Online (Sandbox Code Playgroud)
其中rtn函数返回对象名称/信号/槽,"line"是文件中的当前QString行.
我所知道的唯一方法是通过对每个组合进行字面编码并将QStrings与if语句进行比较,但这将是非常繁琐的,因为组合的数量将非常高.
注意: 这里有一个简单的例子证明基本上是这个问题如何存在.
第1帧:4个QComboBoxes.第一个和第三个保持对象名称,第二个保持信号,第四个保持槽.每个项目当然都是这些列表中的QString.点击按钮会在文件中添加一个新行,写入从每个框中选择的文本.
第2帧:已经拥有所需的对象.读取文件时,它会将列表中定义的对象与已创建的对象进行匹配,并在文件描述时将它们连接起来.
基于文件保存的数据创建对象很容易,但是如何从文件创建/拉出信号和插槽?
编辑: 除非,是否能够像这样连接?
connect(objectA, "", objectB, "");
Run Code Online (Sandbox Code Playgroud)
因为我发现我的代码会像那样编译,但每当我尝试插入插槽或信号名称时,我只会收到如下错误:
QObject :: connect:使用SIGNAL宏绑定Tile :: clicked
我想知道如何在对象的表面上循环纹理.
对于一个实际的例子,我正在尝试处理渲染世界几何,所以当我调整一个两倍于其纹理大小的世界对象时,纹理将出现两次 - 不是两倍大小.
有没有正确的方法来处理这个?我能想到的唯一一件事就是物理地创建一个全新的纹理,它具有合适的大小并手动复制X次,但听起来它会很快耗尽大量内存.
这是在XAxis上调整平面大小时显示我正在寻找的图片:

与许多其他变量一起,我将对象的UVMap作为"纹理坐标"传递给我的着色器,然后执行以下操作以在绘制数组调用之前渲染对象的纹理:
QImage image;
image = worldObject->getQImage(i); //Within a for loop, grabs the right texture if the object has differing textures per face of object
glBindTexture(GL_TEXTURE_2D, spot);
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, image.bits());
Run Code Online (Sandbox Code Playgroud)