求C#大神帮忙用C#重写下面代码,要求编译正确。

float InvSqrt(float x) {
float xhalf = 0.5f*x;
int i = *(int*)&x; // get bits for floating VALUE
i = 0x5f375a86- (i>>1); // gives initial guess y0
x = *(float*)&i; // convert bits BACK to
float x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
return x;
}
备注:函数的输入与返回值要求是decimal类的(不知道在原则上是否可行),请指教!

快速平方根倒数
decimal是128bit浮点数,原则上可行。
1、要找一个类似0x5f375a86的魔术数字R就可以了。
2、这个R也要是128bit的整型,C#也不支持。可以用long[2]来实现减法和位移操作,
C#/.net甚至PC/x86先天不支持128bit的整型,要先实现整型的指针、位移、减法操作,
就意味这个"快速"算法作用于128bit时失去了快速的优势。
而用普通算法,这个函数值f(x)等于1除以x的平方根,得到一样的值。
所以作用于128bit时是否真快速,有待研究吧

对于32bit和64bit,可以改成:
//32bit
static public unsafe float InvSqrt(float x) //加unsafe关键字
{
float xhalf = 0.5f * x;
int i = *(int*)&x;
i = 0x5f375a86 - (i >> 1); // 魔术数字
x = *(float*)&i;
x *= (1.5f - xhalf * x * x);
return x;
}
//64bit
static public unsafe double InvSqrt(double x)
{
double xhalf = 0.5 * x;
long i = *(long*)&x;
i = 0x5fe6eb50c7aa19f9 - (i >> 1);
x = *(double*)&i;
x *= (1.5 - xhalf * x * x);
return x;
}
这2个快速算法90年代时值得称赞。在21世纪的PC已经失去了快速优势,x86的cpu集成了SSE的机器指令 rsqrtss 能更快速更精确地求得该值。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-08-21
decimal InvSqrt(float x)
{
float xhalf = 0.5f * x;
int i = (int)x; // get bits for floating VALUE
i = 0x5f375a86 - (i >> 1); // gives initial guess y0
x = i; // convert bits BACK to
return Convert.ToDecimal(x * (1.5f - xhalf * x * x)); // Newton step, repeating increases accuracy
}追问

请问能不能把函数入口的类型也设为decimal,而且函数中间运算时也最好都是decimal的,因为我希望得到尽可能高的精度,(本人初学C#,其中数据类型的原委不是很清楚,如果思路有错,请指正)

求C#大神帮忙用C#重写下面代码,要求编译正确。
1、要找一个类似0x5f375a86的魔术数字R就可以了。2、这个R也要是128bit的整型,C#也不支持。可以用long[2]来实现减法和位移操作,C#\/.net甚至PC\/x86先天不支持128bit的整型,要先实现整型的指针、位移、减法操作,就意味这个"快速"算法作用于128bit时失去了快速的优势。而用普通算法,这个函数值f(x...

C#代码 。。求大神帮讲解下下面的代码哇 、、
就是在panel1里画311*160的图,但是这图有点特别,是由50多个311*3的小图组成的。int heigh = 0;\/\/设初始高为0 private void timer2_Tick(object sender, EventArgs e){ if (heigh <= 160){ this.panel1.Size = new System.Drawing.Size(311, heigh);\/\/画311*height的图 heigh += 3...

求高手解决---用C#控制台应用程序编代码实现以下要求!!!
第一步,取数字和点,不管它中间有几个点都取了 第二步,判断点的个数,超过2个则丢弃即可

求大神解答,用c#编,在线等
2.编写三个类:水果(Fruit)、苹果(Apple)和桔子(Orange)。a)苹果和和桔子类都是水果类的子类;b)为三个类设计合理的字段和方法,并在子类中用new隐藏父类的一个方法;c)每个类都要设计带参数的构造方法,用于初始化字段的值;d)通过控制台或Windows界面应用程序,编写测试代码。public class ...

高分求人谁帮我改下代码(C#)???
public class first { public static void Main(){ Console.WriteLine("你好,请输入你的中文全名:");String name = "";while ((name=Console.ReadLine())!="exit"){ if (name == "魏亚明" ){ Console.Write("你真是{0}? 你难道就是传说中的英雄???", name);Console.WriteLine("请...

求各位高手帮忙,用c#或c++写一个200行左右的程序,要有注释,能让人...
⑷ 编写求集合A、B的交C=A∩B的函数,并输出集合C的元素;⑸ 编写求集合A、B的并D=A∪B的函数,并输出集合D的元素;实现: VC6.0(C实现 控制台)\/\/ SET.cpp : Defines the entry point for the console application.\/\/ include "stdafx.h"\/ 2012年4月10日21:17:33 功能:集合 说明...

求一个很基础的c#代码!!万分感谢!!!
我是c#的初学者,老师要求编出一段代码,可以计算形如654*6+65-27\/654的多项式,多项式不能有括号,请大侠帮忙了!!老师的要求就是这个啊!写计算器不对啊!... 我是c#的初学者,老师要求编出一段代码,可以计算形如654*6+65-27\/654的多项式,多项式不能有括号,请大侠帮忙了!!老师的要求就是这个啊!写计算器不...

c#如何反编译代码?
1、首先在百度上搜索下载反编译工具ILSpy,解压后如图,双击.exe文件打开解压工具。2、选择file选项,点击“打开”。3、接着选择要反编译的文件,点击“打开”。4、这是会出现一个对话框,在这个对话框里面就可以看到源码了。5、如果想把源码保存下来,自己在源码的基础上修改,点击"file"下的“Save ...

用C#完成这道题,注意是C#!!!不是C++!!求大神帮帮忙!!!
"升序"); else if (flag == 0) Console.WriteLine("无序"); else if (flag == 1) Console.WriteLine("降序");}else{ Console.WriteLine("输入的不是数字,或太大。");}注释写的很详尽了,徒手写的代码,没经过测试,不过思路题主应该能看懂了。

如何用C#动态编译,执行代码
代码如下:\/* * 使用 C# 动态编译代码和执行 * 作者: yaob *\/ static void Main(string[] args) { \/\/ 编译器 CodeDomProvider cdp = CodeDomProvider.CreateProvider("C#"); \/\/ 编译器的参数 CompilerParameters cp = new CompilerParameters(); cp.ReferencedAssemblies.Add("System.dll"); cp....

相似回答