C# C通过指定小数位数提高除法运算的CPU速度

C# C通过指定小数位数提高除法运算的CPU速度,c#,performance,optimization,operators,C#,Performance,Optimization,Operators,这是关于优化CPU速度的。我在寻找纳秒级的增益 基本设置: double Result; Result = (double) 1 / 3; 这等于0.333。我要找的是只有4个有效的小数位,而不做整除运算。因此,除法后四舍五入没有任何区别。CPU应在到达小数点后第4位时停止处理该问题 这是一种进步吗 int Num = (int) 1 * 10000 / 3; double Result = Num / (double) 10000; 或者干脆 double Result = (int)(1

这是关于优化CPU速度的。我在寻找纳秒级的增益

基本设置:

double Result;
Result = (double) 1 / 3;
这等于0.333。我要找的是只有4个有效的小数位,而不做整除运算。因此,除法后四舍五入没有任何区别。CPU应在到达小数点后第4位时停止处理该问题

这是一种进步吗

int Num = (int) 1 * 10000 / 3;
double Result = Num / (double) 10000;
或者干脆

double Result = (int)(1*10000/3)/(double)10000
这个快吗?即使再乘以10000


我希望数学方法有点像数学。除法分子,分母,小数点。有什么建议吗?

CPU不按顺序计算结果的位数。此外,CPU使用二进制数,而不是像普通人那样使用十进制数。 无论如何,程序员不能弄乱他们的内部:这些算法是物理上内置在硬件中的。 因此,您不能部分执行指令

SSE中有几种低精度指令,它们的工作速度比完全精确的指令快得多:即倒数指令和rsqrt指令。但它们只是一般规则的两个例外。一般来说,几乎所有指令都没有低精度的等价物

事实上,在现代CPU上,乘法运算要比除法运算快得多。因此,如果分母在除法之间没有变化,你应该预先计算它的倒数,即倒数,然后用它乘以所有的分子。以向量归一化为例:

双x,y,z//输入向量 双倒扣=1.0/sqrtx*x+y*y+z*z; x*=invLen;y*=invLen;z*=invLen;
C++编译器通常不会执行这种优化,因为根据IEEE的浮点运算规则,a/b和a*1/b可能略有不同。但如果你打开快速数学开关,他们就会这么做。我不确定C编译器在默认情况下的行为。此外,编译器可以轻松地用乘法代替编译时常量整数的除法。

CPU在同一固定类型内计算额外的位不需要额外的成本。。四舍五入是一个单独的问题,如果/根据需要进行四舍五入,因为它会改变结果。是一本有趣的书,而且可能是相关的。而且,在一天结束时,这类优化可能不会相关。在这种情况下,代码可能不在C中,这应该是一个性能热点。对于整数除法,请参见:它是C++,但是您可以导入C。如果分工确实是问题所在,那么可能还有其他优化方法。在不知道您在做什么的情况下,很难建议…@user2864740,特别是对于编译时常量,如示例所示。标准推荐:非常感谢!正是我想要的。另外,我有一个确切的设置…用常数除数改变变量。所以,谢谢你扩展了答案。以前,我主要依靠。但这澄清了这一点。