Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 07.12.2014
Сообщений: 13
1

Вычисление квадратного корня из числа (без использования стандартных математических функций)

18.03.2015, 09:31. Показов 4386. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Напишите программу, вычисляющую квадратный корень из числа (не пользуясь стандартными математическими функциями)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2015, 09:31
Ответы с готовыми решениями:

Вычисление квадратного корня без использования стандартных функций
Как вычислить квадратный корень без использования функции math.sqrt и библиотеки math в целом?

Вычисление квадратного корня из числа без использования сопроцессора
Помогите пожалуйста вычислить функцию корень из Х без использования сопра.

Нахождение корня числа без математических функций
Требуется написать класс с единственным публичным методом, который, принимая аргумент a (a>0),...

Функция: вычисление наименьшего общего кратного без использования стандартных функций
Нужно написать функцию, которая вычисляет наименьшее общее кратное двух заданных на входе...

1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
18.03.2015, 10:19 2
Лучший ответ Сообщение было отмечено kronsh3 как решение

Решение

Из musl-1.1.4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <iostream>
#include <cstdint>
 
/* Get two 32 bit ints from a double.  */
#define EXTRACT_WORDS(hi,lo,d)                    \
do {                                              \
  union {double f; uint64_t i;} __u;              \
  __u.f = (d);                                    \
  (hi) = __u.i >> 32;                             \
  (lo) = (uint32_t)__u.i;                         \
} while (0)
 
/* Set a double from two 32 bit ints.  */
#define INSERT_WORDS(d,hi,lo)                     \
do {                                              \
  union {double f; uint64_t i;} __u;              \
  __u.i = ((uint64_t)(hi)<<32) | (uint32_t)(lo);  \
  (d) = __u.f;                                    \
} while (0)
 
static const double tiny = 1.0e-300;
 
double my_sqrt( double x ) {
    double z;
    int32_t sign = (int)0x80000000;
    int32_t ix0,s0,q,m,t,i;
    uint32_t r,t1,s1,ix1,q1;
 
    EXTRACT_WORDS(ix0, ix1, x);
 
    /* take care of Inf and NaN */
    if ((ix0&0x7ff00000) == 0x7ff00000) {
        return x*x + x;  /* sqrt(NaN)=NaN, sqrt(+inf)=+inf, sqrt(-inf)=sNaN */
    }
    /* take care of zero */
    if (ix0 <= 0) {
        if (((ix0&~sign)|ix1) == 0)
            return x;  /* sqrt(+-0) = +-0 */
        if (ix0 < 0)
            return (x-x)/(x-x);  /* sqrt(-ve) = sNaN */
    }
    /* normalize x */
    m = ix0>>20;
    if (m == 0) {  /* subnormal x */
        while (ix0 == 0) {
            m -= 21;
            ix0 |= (ix1>>11);
            ix1 <<= 21;
        }
        for (i=0; (ix0&0x00100000) == 0; i++)
            ix0<<=1;
        m -= i - 1;
        ix0 |= ix1>>(32-i);
        ix1 <<= i;
    }
    m -= 1023;    /* unbias exponent */
    ix0 = (ix0&0x000fffff)|0x00100000;
    if (m & 1) {  /* odd m, double x to make it even */
        ix0 += ix0 + ((ix1&sign)>>31);
        ix1 += ix1;
    }
    m >>= 1;      /* m = [m/2] */
 
    /* generate sqrt(x) bit by bit */
    ix0 += ix0 + ((ix1&sign)>>31);
    ix1 += ix1;
    q = q1 = s0 = s1 = 0;  /* [q,q1] = sqrt(x) */
    r = 0x00200000;        /* r = moving bit from right to left */
 
    while (r != 0) {
        t = s0 + r;
        if (t <= ix0) {
            s0   = t + r;
            ix0 -= t;
            q   += r;
        }
        ix0 += ix0 + ((ix1&sign)>>31);
        ix1 += ix1;
        r >>= 1;
    }
 
    r = sign;
    while (r != 0) {
        t1 = s1 + r;
        t  = s0;
        if (t < ix0 || (t == ix0 && t1 <= ix1)) {
            s1 = t1 + r;
            if ((t1&sign) == sign && (s1&sign) == 0)
                s0++;
            ix0 -= t;
            if (ix1 < t1)
                ix0--;
            ix1 -= t1;
            q1 += r;
        }
        ix0 += ix0 + ((ix1&sign)>>31);
        ix1 += ix1;
        r >>= 1;
    }
 
    /* use floating add to find out rounding direction */
    if ((ix0|ix1) != 0) {
        z = 1.0 - tiny; /* raise inexact flag */
        if (z >= 1.0) {
            z = 1.0 + tiny;
            if (q1 == (uint32_t)0xffffffff) {
                q1 = 0;
                q++;
            } else if (z > 1.0) {
                if (q1 == (uint32_t)0xfffffffe)
                    q++;
                q1 += 2;
            } else
                q1 += q1 & 1;
        }
    }
    ix0 = (q>>1) + 0x3fe00000;
    ix1 = q1>>1;
    if (q&1)
        ix1 |= sign;
    ix0 += m << 20;
    INSERT_WORDS(z, ix0, ix1);
    return z;
}
 
 
int main()
{
    std::cout << "sqrt( 2 ) = " << my_sqrt( 2. ) << std::endl;
    return 0;
}
0
18.03.2015, 10:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2015, 10:19
Помогаю со студенческими работами здесь

Написать программу возведения целого числа в целую степень, без использования стандартных функций
Здравствуйте!!! Помогите , пожалуйста написать программу с помощью цикла. написать программу...

Преобразовать символьное представление целого числа в целое число без использования стандартных функций
Всем доброго вечера! Народ, кто-нибудь знает как пробразовать символьное представление числа &quot;123&quot;...

Извлечение квадратного корня без использования функции
Всем привет. У меня возник вопрос. Можно ли извлечь корень из числа без функции Math.Sqrt(double);?...

Вычисление квадратного корня без cmath
Всем привет. Сделал простенький калькулятор без cmath, &quot;+,-,*,/,степень и квадратный корень&quot;....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru