C++ 翻译c/c++;?
我在Christopher Ttremblay的《游戏程序员的数学》一书中发现了以下代码。它看起来像C++,他确实把一组性能比较引用到STLLIB,给出的代码是这样的:C++ 翻译c/c++;?,c++,translate,C++,Translate,我在Christopher Ttremblay的《游戏程序员的数学》一书中发现了以下代码。它看起来像C++,他确实把一组性能比较引用到STLLIB,给出的代码是这样的: float Exp2(float X) { float Result, Square, IntPow; if (X < 0) { const unsigned long IntVal = *(unsigned long *)&X & 0x7FFFFFFF; c
float Exp2(float X)
{
float Result, Square, IntPow;
if (X < 0) {
const unsigned long IntVal = *(unsigned long *)&X & 0x7FFFFFFF;
const unsigned long Int = (IntVal >> 23) - 127;
if ((long)Int > 0) {
*(unsigned long *)&IntPow = ((((IntVal & 0x007FFFFF) |
0x00800000) >> (23 - Int)) + 127 + 1) << 23;
*(unsigned long *)&X = (((IntVal << Int) & 0x007FFFFF)
| 0x3F800000);
X = 2.0f - X;
} else {
IntPow = 2.0f;
X++;
}
Result = X0CoEff + Square * X1CoEff;
Square *= X; // The 2 last lines are repeated for every coeff.
Result += Square * XiCoEff;
...
return Result / IntPow;
} else {
const unsigned long IntVal = *(unsigned long *)&X;
const unsigned long Int = (IntVal >> 23) - 127;
if ((long)Int > 0) {
*(unsigned long *)&IntPow = ((((IntVal & 0x007FFFFF) |
0x00800000) >> (23 - Int)) + 127) << 23;
*(unsigned long *)&X = (((IntVal << Int) & 0x007FFFFF)
| 0x3F800000);
X—;
} else
IntPow = 1.0f;
Square = X;
Result = X0CoEff + Square * X1CoEff;
Square *= X; // The 2 last lines are repeated for every coeff.
Result += Square * XiCoEff;
...
return Result * IntPow;
}
}
float log2(float X)
{
float Result, Square;
Result = (float)((*(unsigned long *)&X) >> 23) - 127 + x0CoEff;
*(unsigned long *)&X = (*(unsigned long *)&X & 0x007FFFFF) | 0x3F800000;
Square = X;
Result += Square * XiCoEff;
Square *= X; // The 2 last lines are repeated for every coeff.
...
return Result;
}
float Exp2(float X)
{
浮点结果,平方,IntPow;
if(X<0){
常量unsigned long IntVal=*(unsigned long*)&X&0x7FFFFFFF;
常量无符号长整数=(IntVal>>23)-127;
如果((长)Int>0){
*(无符号长*)和IntPow=((IntVal和0x007FFFFF)|
0x00800000)>>(23-Int))+127+1)23)-127;
如果((长)Int>0){
*(无符号长*)和IntPow=((IntVal和0x007FFFFF)|
0x00800000)>>(23-Int))+127)23)-127+x0CoEff;
*(无符号长*)&X=(*(无符号长*)&X&0x007FFFFF)| 0x3F800000;
平方=X;
结果+=平方*XiCoEff;
Square*=X;//每个系数重复最后两行。
...
返回结果;
}
问题是我从来没有真正学习过位运算(我想这就是这里发生的事情,如果没有的话,我仍然没有在我的编码任务中处理过十六进制)。如果有人能够通过评论或将其翻译到更高级别的c/c++来理解,或许可以提供帮助
这本书解释说,与stllib相比,这些应该是函数的优化版本,但正如您所看到的,代码没有得到很好的注释(这些行是逐字符复制的)你不需要真正了解他们在做什么。如果你愿意,你可以用C语言搜索bitshift操作符并了解操作符在做什么,但这可能无助于你理解代码。真的,代码只是包含了非常复杂的方法,可以非常快地完成任务。你是什么意思?它已经很高级了!:P@s科学家好的,也许高级是个错误的术语,但我的意思是,更多的是不具体处理位,而是那些位所持有的值。这是一堆算术魔术。奥列克西说的。如果你不熟悉位运算,这不是要学的东西。这就像试图理解如果你以前从未使用过钢结构,那么还有吊桥的设计。在你尝试跑马拉松之前,你需要爬行。这个问题应该重新讨论。位洗牌的复杂性与此无关。随着处理器对此类黑客行为变得越来越敏感,这本书已经过时。在FP和int寄存器之间移动速度很慢,而且会变得越来越慢在深入研究IEEE 754格式之前,要检查性能是否真的提高了。