最近我正在分析一个程序,其中热点肯定是这个
double d = somevalue();
double d2=d*d;
double c = 1.0/d2 // HOT SPOT
Run Code Online (Sandbox Code Playgroud)
之后不使用值d2,因为我只需要值c.前段时间我已经读过关于快速平方根的Carmack方法,显然不是这种情况,但我想知道类似的算法是否可以帮助我计算1/x ^ 2.
我需要非常准确的精度,我已经检查过我的程序没有使用gcc -ffast-math选项给出正确的结果.(克++ - 4.5)
我注意到计算平方根的整数部分uint64_t要复杂得多int64_t.请问有人对此有解释吗?为什么处理一个额外的位似乎要困难得多?
下列:
int64_t sqrt_int(int64_t a) {
return sqrt(a);
}
Run Code Online (Sandbox Code Playgroud)
与铛5.0和编译-mfpmath=sse -msse3 -Wall -O3到
sqrt_int(long): # @sqrt_int(long)
cvtsi2sd xmm0, rdi
sqrtsd xmm0, xmm0
cvttsd2si rax, xmm0
ret
Run Code Online (Sandbox Code Playgroud)
但是以下内容:
uint64_t sqrt_int(uint64_t a) {
return sqrt(a);
}
Run Code Online (Sandbox Code Playgroud)
编译为:
.LCPI0_0:
.long 1127219200 # 0x43300000
.long 1160773632 # 0x45300000
.long 0 # 0x0
.long 0 # 0x0
.LCPI0_1:
.quad 4841369599423283200 # double 4503599627370496
.quad 4985484787499139072 # double 1.9342813113834067E+25
.LCPI0_2:
.quad 4890909195324358656 # double 9.2233720368547758E+18
sqrt_int(unsigned long): # @sqrt_int(unsigned long) …Run Code Online (Sandbox Code Playgroud) 我被许多程序员警告不要使用平方根功能,而是将数字提升到半功率.我的问题是双重的:
这样做的感知/真实表现有什么好处?为什么它更快?
如果它真的更快,为什么平方根函数甚至存在?
我需要编写程序来查找长度为数千位的数字的整数平方根.我不能使用Newton Raphson,因为我没有数据类型来存储和划分这么大的数字.我在C中使用长数组来存储数字.是否有任何算法可以通过迭代数字找到平方根?
编辑:
我不能像GMP一样使用外部库.
我正在使用 BigInteger 对象。对于普通整数或长整数,我可以使用 Math.pow(number, 1/nth root) 来获得第 n 个根。但是,这不适用于 BigInteger。有没有办法做到这一点?
我其实并不需要根,只是想知道它是否是完美的力量。我用它来确定给定的 BigInteger 是否是一个完美的正方形/立方体/等。
有什么区别x**(1/2),math.sqrt()和cmath.sqrt()?
为什么cmath.sqrt()单独得到二次方的复杂根?我应该专门用于我的平方根吗?他们在背景中的做法有何不同?
美好的一天,
我的一个朋友正在询问将整数平方根函数转换为元函数.这是原始功能:
unsigned isqrt(unsigned value)
{
unsigned sq = 1, dlt = 3;
while(sq<=value)
{
sq += dlt;
dlt += 2;
}
return (dlt>>1) - 1;
}
Run Code Online (Sandbox Code Playgroud)
我使用了一个元版本constexpr,但他说他出于某种原因无法使用新功能:
constexpr std::size_t isqrt_impl
(std::size_t sq, std::size_t dlt, std::size_t value){
return sq <= value ?
isqrt_impl(sq+dlt, dlt+2, value) : (dlt >> 1) - 1;
}
constexpr std::size_t isqrt(std::size_t value){
return isqrt_impl(1, 3, value);
}
Run Code Online (Sandbox Code Playgroud)
所以我认为将其转换为以递归方式调用它的模板结构应该不难:
template <std::size_t value, std::size_t sq, std::size_t dlt>
struct isqrt_impl{
static const std::size_t square_root =
sq <= …Run Code Online (Sandbox Code Playgroud) 是否可以在不使用 math.h 库的情况下计算两点之间的距离?我知道,使用 math.h 库,它必须是以下几行(欧几里德距离公式)中的一些内容:
int Distance(int x1, int y1, int x2, int y2)
{
int dx = x2 - x1;
int dy = y2 - y1;
return sqrt(dx*dx + dy*dy);
}
Run Code Online (Sandbox Code Playgroud)
但是,有没有办法在不使用平方根(需要 math.h 库)的情况下做完全相同的事情?
编辑:每当我尝试以下代码时,它都会给我浮点异常(核心转储):
float sqrt(int x) {
int i;
float s;
s=((x/2)+x/(x/2)) / 2; /*first guess*/
for(i=1;i<=4;i++) { /*average of guesses*/
s=(s+x/s)/2;
}
return s;
}
float Distance(float x1, float y1, float x2, float y2) {
float dx = x2 - x1;
float dy = y2 …Run Code Online (Sandbox Code Playgroud) 我是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?