Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用定点代替浮点快速求平方根_C++_C_Math_Approximation_Fixed Point - Fatal编程技术网

C++ 用定点代替浮点快速求平方根

C++ 用定点代替浮点快速求平方根,c++,c,math,approximation,fixed-point,C++,C,Math,Approximation,Fixed Point,我试图实现一个固定的点数,但我没有任何进展 我试图遵循与本文完全相同的原则,除了不使用浮点格式x=(-1)^s*(1+M)*2^(E-127),而是使用x=M*2^-16格式,这是一个32位的固定点数,包含16个十进制位和16个小数位 问题是我找不到“魔法常数”的值。根据我的计算,它不存在,但我不是数学家,我认为我做的每件事都错了 为了解Y=1/sqrt(x),我使用了以下推理(我不知道它是否正确) 在原始代码中,牛顿近似的Y0由下式给出: i = 0x5f3759df - (i >>

我试图实现一个固定的点数,但我没有任何进展

我试图遵循与本文完全相同的原则,除了不使用浮点格式
x=(-1)^s*(1+M)*2^(E-127)
,而是使用
x=M*2^-16
格式,这是一个32位的固定点数,包含16个十进制位和16个小数位

问题是我找不到“魔法常数”的值。根据我的计算,它不存在,但我不是数学家,我认为我做的每件事都错了

为了解Y=1/sqrt(x),我使用了以下推理(我不知道它是否正确)

在原始代码中,牛顿近似的Y0由下式给出:

i = 0x5f3759df - (i >> 1);
y0 = (1 + R2 - M / 2) * 2 ^ (R1 - E / 2);
error = (Y - Y0) / Y
这意味着我们将得到一个由以下公式给出的浮点数:

i = 0x5f3759df - (i >> 1);
y0 = (1 + R2 - M / 2) * 2 ^ (R1 - E / 2);
error = (Y - Y0) / Y
这是因为操作
>
将指数和尾数除以2,然后我们将数字作为整数进行减法运算

按照本文所示的步骤,我将x的格式设置为:

x = M * 2 ^ -16
为了执行相同的逻辑,我尝试为以下对象定义Y0:

Y0 = (R2 - M / 2) * 2 ^ (R1 - (-16/2));
我试图找到一个数字,它可以通过以下方式最小化错误:

i = 0x5f3759df - (i >> 1);
y0 = (1 + R2 - M / 2) * 2 ^ (R1 - E / 2);
error = (Y - Y0) / Y
不管R1的值是多少,我都可以执行移位操作来修正最终结果的指数值,在一个固定点上得到正确的结果

我哪里错了?

这不可能

快速逆sqrt是由于浮点表示,它已经将数字拆分为二次幂(指数)和有效值

这是可以做到的


使用与浮点相同的技巧,可以将定点转换为2^exp*x。给定
uint32\u t a
uint8\u t exp=bias-builtin\u count\u leading\u zero(a)
uint32\u t b=a如果问题是数学,那么这个问题可能属于数学交换。@christiangibons:当然不是;“快速平方根逆”使用了IEEE-754二进制32浮点表示法的细节以及浮点算法的特点,使算法适应定点算法的任务是一个软件工程问题。我看到了一种使用相同原理的技术,然而,我将在未来的FPGA中实现该算法,“内置计数前导零”将不是一件好事。这将涉及一个“优先级编码器”,据我所知,它将限制我可以在电路上使用的时钟速度。这个算法是错误的吗?@vincente cesar最好在问题中提到这一点。我们不知道你的FPGA的细节。您可以尝试一点一点的算法,无论是恢复的还是非恢复的变体,并可能将其管道化。如果你有一个计数前导零电路、乘法器和一点ROM空间,你可以尝试一个基于牛顿-拉斐逊的算法,正如我在这里讨论的利用仔细选择的常数的方法中所展示的那样。其美妙之处在于,该解决方案通常在3次迭代中收敛,从而在选定的精度范围内非常有效。在FPGA中,我可能会通过一次左移16,8,4,2,1位来标准化该值,每次迭代得到一位指数。它可能不会限制时钟速度,但会增加延迟。@Akisuikonen我正试图研究链路上的算法。是否可以调整它来计算数字的倒数?我仍在努力理解。我读了尽可能多的解,它的算法看起来是计算平方根倒数和倒数的最佳算法。我使用的是FPGA斯巴达6 xc6slx16。