Math 查找2的平方根,最大不超过100个小数位

Math 查找2的平方根,最大不超过100个小数位,math,square-root,newtons-method,Math,Square Root,Newtons Method,我试图通过使用牛顿的方法得到这项工作,正如这里所描述的:使用下面的代码,但问题是它给出的精确结果最多只有16位小数。我试图增加迭代次数,但结果还是一样的。我从最初的猜测1开始。那么,我如何提高答案的准确性(最多100位或更多小数位)? 谢谢 代码: double x0,x1; #定义n2 双f(双x0) { 返回((x0*x0)-n); } 双firstDerv(双x0) { 返回2.0*x0; } int main() { x0=n/2.0; int i; 对于(i=0;i),当前机器上的浮点

我试图通过使用牛顿的方法得到这项工作,正如这里所描述的:使用下面的代码,但问题是它给出的精确结果最多只有16位小数。我试图增加迭代次数,但结果还是一样的。我从最初的猜测1开始。那么,我如何提高答案的准确性(最多100位或更多小数位)? 谢谢 代码:

double x0,x1;
#定义n2
双f(双x0)
{
返回((x0*x0)-n);
}
双firstDerv(双x0)
{
返回2.0*x0;
}
int main()
{
x0=n/2.0;
int i;

对于(i=0;i),当前机器上的浮点数为,且精度有限(约15位)

如果您想要更高的精度,您将需要(缓慢地)由软件库提供的精度,如


您还可以使用bignums用语言和实现对程序进行编码。

当前计算机上的浮点数是有限的,且精度有限(约15位)

如果您想要更高的精度,您将需要(缓慢地)由软件库提供的精度,如


你也可以用BIGNAMS语言和程序实现你的程序。

< P>你不能用这种方法来做;双打没有足够的位来获得100个精度的地方。考虑使用一个任意精度的库,例如

< P>你不能用这种方法来做;双打没有足够的位来获得100个PLA。计算精度的CES。考虑使用任意精度的库,例如

< P>,这可能是因为浮点数是由计算机通过M×10 ^ E形式来近似的。因为M和E由有限数目的数字组成,所以不能以绝对精度逼近所有数。< /P>
想想1/3,也就是0.333333333…

也许这是因为计算机通过m*10^e形式来近似浮点数。因为m和e由有限个数字组成,所以不能绝对精确地近似所有数字


想想1/3,也就是0.333333…

要解决有限精度浮点的问题,你也可以用牛顿的方法 在每次迭代中找到一个有理数(a/b,带有a和b整数),它是sqr(2)的更好近似值

如果x=a/b是您上次迭代返回的值,则牛顿方法说明新估计值y=c/d为:

y=x/2+1/x=a/2b+b/a=(a^2+2b^2)(2ab)

因此:

c=a^2+2b^2

d=2ab

每次迭代的精度都是原来的两倍。由于命名和分母快速增加,所以精度仍然有限,但可能会找到一个大整数的实现(或者自己合成一个)比找到任意精度浮点的实现更容易。而且,如果你真的对小数感兴趣,那么这个答案对你没有帮助。它确实给了你一个非常精确的sqr(2)估计

只需对算法的a/b进行一些迭代:

1/1、3/2、17/12、577/408、665857/470832


665857/470832近似sqr(2),误差为1.59e-12。误差仍为1/a^2阶,因此将a和b实现为long将使精度达到1e-37-ish。

要解决有限精度浮点的问题,还可以使用牛顿法 在每次迭代中找到一个有理数(a/b,带有a和b整数),它是sqr(2)的更好近似值

如果x=a/b是您上次迭代返回的值,则牛顿方法说明新估计值y=c/d为:

y=x/2+1/x=a/2b+b/a=(a^2+2b^2)(2ab)

因此:

c=a^2+2b^2

d=2ab

每次迭代的精度都是原来的两倍。由于命名和分母快速增加,所以精度仍然有限,但可能会找到一个大整数的实现(或者自己合成一个)比找到任意精度浮点的实现更容易。而且,如果你真的对小数感兴趣,那么这个答案对你没有帮助。它确实给了你一个非常精确的sqr(2)估计

只需对算法的a/b进行一些迭代:

1/1、3/2、17/12、577/408、665857/470832


665857/470832近似于sqr(2)误差为1.59e-12。误差仍将保持在1/a^2级,因此将a和b实现为long将使精度达到1e-37-ish。

您是否搜索过所使用的
double
数据类型的精度?请阅读以下内容:使用IEEE标准
double
,您无法获得如此高的精度。您需要一个大的ger浮点类型。有一个任意值库的列表。检查其中一个可以获得超过16位的精度。您搜索过您正在使用的
double
数据类型的精度吗?请阅读以下内容:使用IEEE标准
double
,您无法获得如此高的精度。您需要更大的浮点值类型。有一个任意值库的列表。检查其中一个可以获得超过16位的精度。大多数浮点表示都是二进制的,因此使用您的表示法的形式是
m*2^e
(即以2为基数,而不是以10为基数)。大多数浮点表示都是二进制的,因此使用您的表示法的形式是
m*2^e
(即base 2,而不是base 10)谢谢,我在python中尝试过,但在那里我也无法获得如此高的精度,尽管它比cAt中的精度更高,至少对于整数bignum,SBCL和SciLab应该有它们。(我不知道浮动bignum的情况)。谢谢,我在python中尝试过,但在python中也无法获得如此高的精度,尽管对于整数bignum,它比cAt中的至少要高,SBCL和SciLab应该有它们。(对于浮点bignum,我不知道)我可以想象写一个长除法例程,一次吐出一个十进制数字,如果你想避免任意精度的话
double x0,x1;
#define n 2
double f(double x0)
{
    return ((x0*x0)-n);
}
double firstDerv(double x0)
{
    return 2.0*x0;
}
int main()
{
    x0 = n/2.0;
    int i;
    for(i=0;i<40000;i++)
    {
        x1=x0-(f(x0)/((firstDerv(x0))));
        x0=x1;
    }
    printf("%.100lf\n",x1);
    return 0;
}