我试图将臭名昭著的fast inverse square root技术从C转换为D编程语言。必要的步骤包括将长位存储在整数中:

i  = * ( long * ) &y;


在评论部分,安德鲁建议将此操作称为类型校正。有谁知道如何在D中执行类型pun操作?

对于那些好奇的人,这里是代码的完整C表示形式:

float Q_rsqrt( float number ) {
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y  = number;
i  = * ( long * ) &y;    // the part in question
i  = 0x5f3759df - ( i >> 1 );
y  = * ( float * ) &i;   // again, but for floating points
y  = y * ( threehalfs - ( x2 * y * y ) );
return y;
}

最佳答案

您真正需要做的就是使用D样式转换-这是D代码与C代码唯一不同的地方。

这是工作程序:

import std.stdio;

float Q_rsqrt(float number) {
  int i;  // we use int here because int.sizeof == float.sizeof
  float x2, y;
  const float threehalfs = 1.5F;
  x2 = number * 0.5F;
  y  = number;
  i  = * cast(int*) &y;
  i  = 0x5f3759df - ( i >> 1 );
  y  = * cast(float*) &i;
  y  = y * ( threehalfs - ( x2 * y * y ) );
  y  = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration

  return y;
}

int main() {
  writeln(Q_rsqrt(0.15625f));
  // Output: 2.52981

  return 0;
}

关于d - 在D中键入修剪,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40574299/

10-11 20:57