我对汇编知之甚少,但我很确定x86上有平方根说明吗?我试图让一个平方根函数在泡沫中运行良好,而且当我运行多次时,我发现的那个函数陷入了困境.
: sqrt-closer ( square guess -- square guess adjustment)
2dup / over - 2 /
;
: sqrt ( square -- root )
1 begin
sqrt-closer dup
while + repeat
drop nip ;
Run Code Online (Sandbox Code Playgroud) 我想用代数方式简化整数的平方根,而不是用数字计算它,即√800应该是20√2,而不是28.2842712474619.
我找不到任何方法通过编程来解决这个问题:(
我一直在寻找计算数字(整数)的平方根(整数)的最快方法.我在维基百科中遇到了这个解决方案,它找到了一个数字的平方根(如果它是一个完美的正方形)或者它最近的下方完美正方形的平方根(如果给定的数字不是一个完美的正方形:
short isqrt(short num) {
short res = 0;
short bit = 1 << 14; // The second-to-top bit is set: 1L<<30 for long
// "bit" starts at the highest power of four <= the argument.
while (bit > num)
bit >>= 2;
while (bit != 0) {
if (num >= res + bit) {
num -= res + bit;
res = (res >> 1) + bit;
}
else
res >>= 1;
bit >>= 2;
}
return res;
}
Run Code Online (Sandbox Code Playgroud)
我尝试了很多测试运行来跟踪算法,但我似乎并不理解里面的部分 …
大多数参考iterate是针对运算符的,并且函数上的所有应用程序都是如此令人困惑,以至于我仍然无法iterate在代码中使用它,以及它是什么partial.
我正在编写一个编程作业,尝试使用牛顿的方法得到数字n的平方根.也就是说,将猜测作为初始近似值,通过计算近似值和n /近似值的平均值来保持计算新的近似值.继续,直到两个最近的近似值之间的差异小于epsilon.
我首先尝试做近似部分,我相信这是我需要使用迭代和部分.后来epsilon是我需要用"拿"的东西?
这是我没有epsilon的近似代码:
(defn sqrt [n guess]
(iterate (partial sqrt n) (/ (+ n (/ n guess)) 2)))
Run Code Online (Sandbox Code Playgroud)
这段代码不能正常工作,当我进入时(sqrt 2 2),它给了我(3/2 user=> ClassCastException clojure.lang.Cons cannot be cast to java.lang.Number clojure.lang.Numbers.divide (Numbers.java:155).
我想这是我需要反复迭代的部分?有人可以给我一些提示吗?再次,这是一个家庭作业问题,所以请不要直接解决整个问题,我需要一些我可以学习的想法和解释.
我是Cuda的新手,我有以下功能:
__global__ void square(float *myArrayGPU)
{
myArrayGPU[threadIdx.x] = sqrt(threadIdx.x);
}
Run Code Online (Sandbox Code Playgroud)
我想使用cuda数学库,我试过,#include "math.h"但我仍然得到错误
error: calling a __host__ function("__sqrt") from a __global__ function("square") is not allowed
知道我应该包含哪些库来使用sqrt?
对于Erlang或的解决方案C / C++,请转到下面的试验4.
isqrt(N) when erlang:is_integer(N), N >= 0 ->
erlang:trunc(math:sqrt(N)).
Run Code Online (Sandbox Code Playgroud)
此实现使用sqrt()C库中的函数,因此它不适用于任意大整数(请注意,返回的结果与输入不匹配.正确的答案应该是12345678901234567890):
Erlang R16B03 (erts-5.10.4) [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V5.10.4 (abort with ^G)
1> erlang:trunc(math:sqrt(12345678901234567890 * 12345678901234567890)).
12345678901234567168
2>
Run Code Online (Sandbox Code Playgroud)
+仅使用Bigint ]isqrt2(N) when erlang:is_integer(N), N >= 0 ->
isqrt2(N, 0, 3, 0).
isqrt2(N, I, _, Result) when I >= N ->
Result;
isqrt2(N, …Run Code Online (Sandbox Code Playgroud) 的回答给出了计算下面的代码floor(sqrt(x))只使用整数.是否可以使用/修改它来返回ceil(sqrt(x))?或者,计算这种价值的首选方法是什么?
编辑:谢谢大家到目前为止我道歉,我应该让它更明确:我希望有更多的"自然"方式来做这个使用floor(sqrt(x)),可能加一个.该floor版本使用牛顿的方法从上面接近根,我认为可能从下面接近它或类似的做法.
例如,答案甚至提供了如何舍入到最接近的整数:只输入4*x算法.
我正在通过位移来研究快速平方根算法。我被维基百科的代码困住了。
short isqrt(short num) {
short res = 0;
short bit = 1 << 14; // The second-to-top bit is set: 1L<<30 for long
// "bit" starts at the highest power of four <= the argument.
while (bit > num)
bit >>= 2;
while (bit != 0) {
if (num >= res + bit) {
num -= res + bit;
res = (res >> 1) + bit;
}
else
res >>= 1;
bit >>= 2;
}
return res;
}
Run Code Online (Sandbox Code Playgroud)
我知道它可以产生正确的结果,但它是如何做到的?我对这句话特别迷惑,res …
如何有效地找到小于给定 int 的最大平方数(即 4、9、16)n?我有以下尝试:
int square = (int)Math.sqrt(number);
return square*square;
Run Code Online (Sandbox Code Playgroud)
但它显然效率低下,无法获得平方根,以便我们可以对其进行平方。
我目前正在寻找一个非常快的整数平方根近似值,其中 floor(sqrt(x)) <= veryFastIntegerSquareRoot(x) <= x
平方根例程用于计算素数,如果仅sqrt(x)检查小于或等于 的值是否为 的除数,则计算速度会快得多x。
我目前拥有的是来自 Wikipedia 的这个函数,稍微调整了一下以使用 64 位整数。
因为我没有其他函数可以比较(或者更准确地说,该函数对于我的目的来说太精确了,而且它可能需要更多的时间,而不是高于实际结果。)