实现sqrt()函数

求一个正数N的开方, 并且可以指定精度, 要求不能用库函数sqrt

方法一:如下所示,先求sqrt(N)的整数部分,再求小数点后1位,2位 ... ...

方法二:牛顿迭代法,根据公式 Ai+1 = (Ai+number/Ai)/2 ,其中Ai 的初始值,即A1任取,如1,2,3 ...

// 求一个正数N的开方, 并且可以指定精度, 要求不能用库函数sqrt

#include <stdio.h>
#include <stdlib.h>

double my_sqrt2(double number, int point)
{
    double new_guess;
    double last_guess;

    if (number < 0) {
        printf("Cannot compute the square root of a negative number!\n");
        return -1;
    }

    printf("Method 2:\n");
    new_guess = 1;
    do {
        last_guess = new_guess;
        new_guess = (last_guess + number/last_guess) / 2;
        printf("%.*lf\n", point, new_guess);
    } while (new_guess != last_guess);

    return new_guess;
}

double my_sqrt1(double n, int point)
{
    if (n < 0) {
        printf("Cannot compute the square root of a negative number!\n");
        return -1;
    }

    int i,j;
    for( i=1; i-n<0; i++ ) // 求得i的开方的整数部分
        if( i*i-n > 0 )
            break;

    double answer = i-1;
    double incr = 0.1;
    for( j=1; j<=point; j++) // 第j次循环,求得i的开方的小数部分的第j位
    {
        for( i=1; i<10; i++ )
        {
            answer += incr;
            if( answer*answer-n > 0 )
                break;
        }
        answer -= incr;
        incr /= 10;
    }
    incr *= 10;
    printf("Method 1:\n");
    printf("sqrt(%lf) is between %.*lf - %.*lf\n", n, point, answer, point, answer+incr);
    return answer;
}

int main(void)
{
    int point;
    double n;
    printf("请输入正整数N: ");
    scanf("%lf",&n);
    printf("请输入精确到小数点后的位数: ");
    scanf("%d",&point);

    my_sqrt1(n,point);
    my_sqrt2(n,point);

    return 0;
}
时间: 2024-10-13 17:06:49

实现sqrt()函数的相关文章

关于sqrt函数的算法

我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然有可能你平时没有想过这个问题,不过正所谓是“临阵磨枪,不快也光”,你“眉头一皱,计上心来”,这个不是太简单了嘛,用二分的方法,在一个区间中,每次拿中间数的平方来试验,如果大了,就再试左区间的中间数:如果小了,就再拿右区间的中间数来试.比如求sqrt(16)的结果,你先试(0+16)/2=8,8*8=

一个Sqrt函数引发的血案

我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然有可能你平时没有想过这个问题,不过正所谓是"临阵磨枪,不快也光",你"眉头一皱,计上心来",这个不是太简单了嘛,用二分的方法,在一个区间中,每次拿中间数的平方来试验,如果大了,就再试左区间的中间数:如果小了,就再拿右区间的中间数来试.比如求sqrt(16)的结果,你先试

【转载】一个Sqrt函数引发的血案

转自:http://www.cnblogs.com/pkuoliver/archive/2010/10/06/sotry-about-sqrt.html 源码下载地址:http://diducoder.com/sotry-about-sqrt.html 好吧,我承认我标题党了,不过既然你来了,就认真看下去吧,保证你有收获. 我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这

sqrt函数实现之卡马克方法

sqrt函数的实现主要有三种方式: 二分法 牛顿法 卡马克方法 这里主要介绍高效的卡马克方法.卡马克方法起源于<雷神之锤III竞技场>中使用的平方根倒数速算法,下列代码是平方根倒数速算法在<雷神之锤III竞技场>源代码中的应用实例.示例剥离了C语言预处理器的指令,但附上了原有的注释: float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.

15、【常见算法】实现sqrt函数

问题:手写代码实现sqrt函数,即求一个整数的平方根 分析:二分查找思想 1 #include <iostream> 2 3 using namespace std; 4 5 int sqrt(int x) 6 { 7 long left = 0; 8 9 if(x == 1) 10 return 1; 11 long right = x; 12 13 long mid = left + (right - left)/2; 14 while(left + 1 < right) 15 {

No.16 sqrt函数问题

#include "stdio.h"#include "math.h"#include "stdlib.h"void main(){float i,x,y;for (i=1;i<100000;i++){x=sqrt(i+100); y=sqrt(i+168); if(x*x==i+100&&y*y==i+168)printf("\n%.2f\n",i);}system("pause")

20170430 math.sqrt函数

sqrt() 方法返回数字x的平方根 语法: import math math.sqrt( x ) 注意:sqrt()是不能直接访问的,需要导入 math 模块,通过静态对象调用该方法. import math # This will import math module print ("math.sqrt(100) : ", math.sqrt(100))print ("math.sqrt(7) : ", math.sqrt(7))print ("mat

自己实现的一个sqrt函数

看了MIT的6.00的计算机科学导论课的第一节,其中,老师讲的一个sqrt的实现算法记忆犹新. 代码如下: #include <stdio.h> #define E 1e-10 double Abs(double a,double b){ if(a-b<0){ return b - a; } return a - b; } double Sqrt(double value){ double i,last=0,cur=0; for(i=0;i*i<value;i++); i--; d

SQL函数说明大全

一旦成功地从表中检索出数据,就需要进一步操纵这些数据,以获得有用或有意义的结果.这些要求包括:执行计算与数学运算.转换数据.解析数值.组合值和聚合一个范围内的值等. 下表给出了T-SQL函数的类别和描述. 函数类别 作用 聚合函数 执行的操作是将多个值合并为一个值.例如 COUNT.SUM.MIN 和 MAX. 配置函数 是一种标量函数,可返回有关配置设置的信息. 转换函数 将值从一种数据类型转换为另一种. 加密函数 支持加密.解密.数字签名和数字签名验证. 游标函数 返回有关游标状态的信息.