小编Mar*_*ník的帖子

C++ 中极低精度的快速单精度倒数平方根

我在 C++ 中有一行

c[i] = sqrtf(a[i]);
Run Code Online (Sandbox Code Playgroud)

和汇编代码看起来

002D11D0  vsqrtps     ymm0,ymmword ptr a (202D3380h)[eax]  
Run Code Online (Sandbox Code Playgroud)

用一条线

c[i] = 1.0f / sqrtf(a[i]);
Run Code Online (Sandbox Code Playgroud)

我有一个集会

00E71210  vrsqrtps    ymm1,ymm0  
00E71214  vmulps      ymm0,ymm1,ymm0  
00E71218  vmulps      ymm0,ymm0,ymm1  
00E7121C  vsubps      ymm0,ymm0,ymm6  
00E71220  vmulps      ymm0,ymm0,ymm1  
00E71224  vmulps      ymm0,ymm0,ymm7
Run Code Online (Sandbox Code Playgroud)

这显然是合理的,因为vrsqrtps比 快得多vsqrtps。因此,在平方根的倒数的情况下,调用不准确的函数vrsqrtps然后进行两次迭代以获得更精确的值会更快。

我的问题是: 是否可以告诉编译器不需要额外的迭代?因此汇编将不需要额外的乘法。~1.5 * 2^-12 的误差对我来说完全足够了,因为我想添加数千个这样的结果,其中许多位的准确性也会下降。我更喜欢一种不将某些汇编代码内联到 C++ 代码中的方法。

(编辑后)编译器命令行:

/GS /Qpar /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /Ox /Ob2 /sdl /Fd"Release\vc141.pdb" /Zc:inline /fp:fast /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /arch:AVX2 /Gd /Oy- /Oi /MD /Fa"Release\" …
Run Code Online (Sandbox Code Playgroud)

c++ performance x86 sqrt

5
推荐指数
1
解决办法
586
查看次数

如何操作(快速)尾数和指数部分的double或浮点数在c ++?

我使用c ++来计算各种类型的特殊函数(例如Lambert函数,用于评估反演的迭代方法等).在许多情况下,直接使用尾数和指数有明显更好的方法.

我找到了许多答案如何提取尾数和指数部分,但是所有这些都只是"学术案例,计算速度不是很快",对我来说有点无用(我用尾数和指数操作的动机是改进计算速度).有时我需要调用一些特定功能大约十亿次(非常昂贵的计算),所以每个节省的计算工作都很好.并且使用将尾数作为double的"frexp"不太合适.

我的问题是(对于带有IEEE 754浮点的c ++编译器):

1)如何读取浮点数/双精度的尾数的具体位?

2)如何将整个尾数读入float/double的整数/字节?

3)与指数1),2)相同的问题.

4)与写入1),2),3)相同的问题.

如果我直接使用尾数或指数,我的动机是更快的计算.我想必须有一个非常简单的解决方案.

c++ mantissa exponent numerical-computing ieee-754

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

对于使用过的类,可以设置重载operator +的优先级吗?

我有两节课:

class_1 a,b;
class_2 u,v;
Run Code Online (Sandbox Code Playgroud)

operator+在所有类组合之间定义的地方.所有添加class_1都为+运算符的两侧输出a 所有类组合.

然后我有一个表达式:

a = u + v + b;
Run Code Online (Sandbox Code Playgroud)

是否有可能执行operator+之间class_1,并class_2具有较高优先级总是那么之间class_2class_2?如果不是,是否存在某种内部规则,例如总是"更多左"运算符(即使使用/ Ox)?

c++ operator-overloading

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

有没有办法在 C++ 中识别重载 operator[] 的类?

假设我们有一个带有运算符 [] 的类,如下所示

class MyClass
{
//...
public:
    TYPE operator[](const size_t idx) const
    {
        //... Implementation
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想阅读TYPE并将其用作另一个类的模板参数。人们可能会使用一种技巧

template<class T>
class OtherClass
{
    //...
}

template<class T>
auto generator(const T& element)
{
    return OtherClass<T>(); 
} 

int main(void)
{
    MyClass myclass;
    auto resulted_class = generator(myclass[0]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这应该创建一个OtherClasswith 模板TYPEfromMyClass并将其复制到resulted_class.

现在的问题。是否有可能实现相同但没有对索引值 0 或任何特定索引值的 [] 运算符的通用调用?关键是不能保证 operator [] 是为特定值定义的。TYPE如果可能,我们只需要提取。

换句话说,如果我们使用一个类,就像std::vector<double>我们想double从那个类中提取它一样。但在没有进一步了解的情况下std::vector。我们唯一知道的是其中有 [] 运算符的定义。

c++ templates types operator-overloading auto

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