标签: square-root

C/C++中的快速反转平方

最近我正在分析一个程序,其中热点肯定是这个

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)

c algorithm performance square-root

9
推荐指数
2
解决办法
5017
查看次数

sqint of uint64_t vs. int64_t

我注意到计算平方根的整数部分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)

x86 assembly sse compilation square-root

8
推荐指数
1
解决办法
373
查看次数

如何计算C#中浮点的平方根

如何计算Floatin的平方根C#,类似于Core.SqrtXNA?

c# math square-root

7
推荐指数
2
解决办法
5万
查看次数

为什么平方根这么慢?

我被许多程序员警告不要使用平方根功能,而是将数字提升到半功率.我的问题是双重的:

  1. 这样做的感知/真实表现有什么好处?为什么它更快?

  2. 如果它真的更快,为什么平方根函数甚至存在?

c# vb.net math square-root operator-keyword

7
推荐指数
2
解决办法
5000
查看次数

什么是有效的算法来逐位找到一个非常大的整数平方根?

我需要编写程序来查找长度为数千位的数字的整数平方根.我不能使用Newton Raphson,因为我没有数据类型来存储和划分这么大的数字.我在C中使用长数组来存储数字.是否有任何算法可以通过迭代数字找到平方根?

编辑:

我不能像GMP一样使用外部库.

c algorithm square-root integer-arithmetic

7
推荐指数
1
解决办法
4437
查看次数

BigInteger 的第 N 个根

我正在使用 BigInteger 对象。对于普通整数或长整数,我可以使用 Math.pow(number, 1/nth root) 来获得第 n 个根。但是,这不适用于 BigInteger。有没有办法做到这一点?

我其实并不需要根,只是想知道它是否是完美的力量。我用它来确定给定的 BigInteger 是否是一个完美的正方形/立方体/等。

java math biginteger square-root

7
推荐指数
1
解决办法
4330
查看次数

**(1/2),math.sqrt和cmath.sqrt之间的区别?

有什么区别x**(1/2),math.sqrt()cmath.sqrt()

为什么cmath.sqrt()单独得到二次方的复杂根?我应该专门用于我的平方根吗?他们在背景中的做法有何不同?

python math sqrt square-root

7
推荐指数
2
解决办法
6300
查看次数

元整数平方根中的无限递归

美好的一天,

我的一个朋友正在询问将整数平方根函数转换为元函数.这是原始功能:

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)

c++ recursion templates metaprogramming square-root

6
推荐指数
2
解决办法
726
查看次数

不使用平方根的两点之间的距离

是否可以在不使用 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)

c distance points square-root

6
推荐指数
2
解决办法
1万
查看次数

为什么我对CUDA数学库sqrt()函数的调用失败了?

我是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

c c++ math cuda square-root

6
推荐指数
2
解决办法
1万
查看次数