Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 20

Функция sqrt

21.03.2017, 07:30. Показов 6283. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему компилятор не выдает ошибку, когда я использую в программе sqrt без объявления библиотеки math.h ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.03.2017, 07:30
Ответы с готовыми решениями:

Дано натуральное число n. Вычислить: sqrt(3+sqrt(6+.+sqrt(3*(n-1)+sqrt(3*n)
Что я делаю не так, подскажите пожалуйста. #include <stdio.h> #include <math.h> #include <stdlib.h> int main(int argc, char...

Перегрузка sqrt
int area(point a, point b, point c) { int p,ab,bc,ca,s; ab=sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y)); ...

undefined reference to `sqrt'
Здравствуйте. Хочу корни квадратного уравнения найти. Из нижеследующего кода выходит ошибка: myclock.c:(.text+0x6e): undefined reference...

14
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
21.03.2017, 07:33
killer9, gcc -pedantic-errors main.c
0
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 20
21.03.2017, 07:37  [ТС]
Я имею в виду, что я использую sqrt в программе, не объявив math.h, при этом программа компилируется, ошибок не выдает, но в переменную, где присутствует sqrt, записывает какой-то мусор
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
21.03.2017, 07:47
killer9, чем компилируете, какие флаги используете, где код?
0
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 20
21.03.2017, 07:50  [ТС]
Microsoft visual, код не важен, меня интересует почему ошибка компиляции не возникает, хотя должна быть
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
21.03.2017, 08:04
Цитата Сообщение от killer9 Посмотреть сообщение
хотя должна быть
Кто сказал?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,296
21.03.2017, 08:13
Цитата Сообщение от killer9 Посмотреть сообщение
Я имею в виду, что я использую sqrt в программе, не объявив math.h, при этом программа компилируется, ошибок не выдает,
Что именно вы понимаете под "ошибок не выдает"? Диагностических сообщений нет вообще? Если так, то значит компилятор не полностью поддерживает требования стандарта С99 и по-старинке позволяет вызов необъявленных функций.

Цитата Сообщение от killer9 Посмотреть сообщение
но в переменную, где присутствует sqrt, записывает какой-то мусор
Классическое последствие вызова необъявленной функции, тип возврата которой не совпадает с int.

Однако попробовал в Visual Studio

C
1
2
3
4
int main()
{
  int i = sqrt(25);
}
Получил ожидаемое "warning C4013: 'sqrt' undefined; assuming extern returning int".

А что именно вы там компилируете, если у вас Visual Studio молчит?
0
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 20
21.03.2017, 08:17  [ТС]
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
#include <stdio.h>
#define MaxMas 100
int A[MaxMas];
int Minz(int N)
{
    int i,min;
    for (i = 0; i<N; i++)
    {
        if (i == 0) min = A[i];
        if ((i != 0) && (A[i] < min)) min = A[i];
    }
    return (min);
}
int Maxz(int N)
{
    int i,max;
    for (i = 0; i<N; i++)
    {
        if (i == 0) max = A[i];
        if ((i != 0) && (A[i] > max)) max = A[i];
    }
    return (max);
}
float SRED(int N)
{
    float sr_znach=0;
    int i;
    for (i = 0; i < N; i++)
        sr_znach = sr_znach + A[i];
    sr_znach = (float) sr_znach / N;
    return (sr_znach);
}
float OTKLON(int N)
{
 
    float sr_otkl=0;
    int i;
    for (i = 0; i < N; i++)
    {
        sr_otkl = sr_otkl + pow((A[i] - SRED(N)), 2);
    }
    sr_otkl = sqrt((float)sr_otkl / N);
    return (sr_otkl);
}
void main()
{
    setlocale(0, "");
    int N, exit=1;
    do
    {
        printf("Введите размер массива (максимальное кол-во элементов: 100): ");
        scanf_s("%d", &N);
        if ((N<=0)||(N > 100))
        {
            printf("Ошибка\n");
        }
 
        if ((N>0)&&(N <= 100))
        {
            int i;
            for (i = 0; i < N; i++)
            {
                printf("A[%d] = ", i);
                scanf_s("%d", &A[i]);
            }
            printf("Максимальный значение=%d\n  Минимальное значение=%d\n Среднее значение=%f\n Среднее отклонение=%f\n\n", Maxz(N), Minz(N), SRED(N), OTKLON(N));
            printf("Хотите повторить расчет с другими данными? (1 - да, 0 - нет) ");
            scanf_s("%d", &exit);
            if (exit == 0)break;
            while (exit != 1)
            {
                printf("Неверно. Повторите: ");
                scanf_s("%d", &exit);
                if (exit == 0) break;
            }
        }
    } while (exit != 0);
}
Добавлено через 34 секунды
Вот, он никакой ошибки компиляции не выдает, хотя math.h не подключена
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,296
21.03.2017, 08:25
Цитата Сообщение от killer9 Посмотреть сообщение
Вот, он никакой ошибки компиляции не выдает, хотя math.h не подключена
Попробовал скомпилировать ваш код. Получил

Code
1
2
3
4
1>d:\development\consoletest\consoletestc.c(40): warning C4013: 'pow' undefined; assuming extern returning int
1>d:\development\consoletest\consoletestc.c(42): warning C4013: 'sqrt' undefined; assuming extern returning int
1>d:\development\consoletest\consoletestc.c(42): warning C4244: '=': conversion from 'int' to 'float', possible loss of data
1>d:\development\consoletest\consoletestc.c(47): warning C4013: 'setlocale' undefined; assuming extern returning int
Вот они, ваши ошибки. Я начинаю подозревать, что вы намекаете на тот факт, что "предупреждения", это не "ошибки". Но в языках С и С++ не существует деления на "предупреждения" и "ошибки". В случае нарушения требований языка ошибки компилятор обязан выдать диагностическое сообщение. А уж отделять мух от котлет, т.е. разгребать эти сообщения на "реальные ошибки" и "просто предупреждения" - это ваша задача. В данном случае треиий (C4244) - это "просто предупреждение", а остальные - "реальные ошибки".

Так уж сложилось, что за прошедшие годы было написано много "гамнокода", которые без таких костылей не компилируется. В некоторых компиляторах для облегчения задачи отделения мух от котлет реализованы вспомогательные средства (типа флага -pedantic-errors в GCC), а где-то приходится полагаться на собственные знания.
0
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 20
21.03.2017, 08:28  [ТС]
Просто программа компилирует запускается, всё делает, а когда записывает в переменную значение, где использованно sqrt , появляется мусор и программа дальше корректно работает
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,296
21.03.2017, 08:32
Цитата Сообщение от killer9 Посмотреть сообщение
компилирует запускается
Это ничего не значит. Спецификация языка С не запрещает "компилировать и запускать" ошибочные программы.

Для того, чтобы программа была корректной с точки зрения языка, надо еще убедиться в том, что среди диагностических сообщений нет сообщений, указывающих на нарушения требований языка.
0
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 20
21.03.2017, 08:36  [ТС]
да это понятно, но вопрос в том: почему не возникает ошибка компиляции при использовании функции, которая не объявлена

Добавлено через 56 секунд
???
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,296
21.03.2017, 08:38
Цитата Сообщение от killer9 Посмотреть сообщение
да это понятно, но вопрос в том: почему не возникает ошибка компиляции при использовании функции, которая не объявлена
Ответ на этот вопрос дан выше. Что именно из вышенаписанного вам не понятно?

И почему вас удивляет такая ситуация в языке, в котором вызов необъявленной функции в течение многих и многих лет его существования не являлся ошибкой? Или вы пытаетесь спросить "почему авторы классического С еще тогда, во времена Царя Гороха, разрешили такие вызовы"?
1
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 20
21.03.2017, 08:52  [ТС]
а почему тогда функция malloc работает корректно без подключения stdlib.h?

Добавлено через 38 секунд
а sqrt без math.h работает некорректно
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,296
21.03.2017, 09:15
Цитата Сообщение от killer9 Посмотреть сообщение
а почему тогда функция malloc работает корректно без подключения stdlib.h?
Функция malloc может создавать иллюзию "работы корректно" чисто засчет ряда случайных совпадений: если на вашей платформе размер типа int совпадает с размером типа void *, и возврат значений типа int и типа void * из функций делается по одному и тому же соглашению (напр., в одном и том же регистре процессора).

Функция возвращает void *, компилятор думает, что это int, но из-за вышеупомянутых совпадений все "как бы работает". Однако попробуйте сделать это на 64-битной платформе, где void * занимает 64 бита, а int - 32, и ваш якобы "работающий" malloc сразу перестанет "работать".

Цитата Сообщение от killer9 Посмотреть сообщение
а sqrt без math.h работает некорректно
А sqrt - функция, возвращающая значение "плавающего" типа - double. Тут шансов на совпадение способа возврата с типом int практически никаких нет. Поэтому - не "работает" никогда.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.03.2017, 09:15
Помогаю со студенческими работами здесь

Вычислить корень из числа без sqrt
На си, Вычислить корень из числа без sqrt . только stdio.h

Не компилируется программа с квадратным корнем 'sqrt'
Компилирует, но при сборке пишет: 4.c: (.text+0x28): undefined reference to `sqrt' #include &lt;stdio.h&gt; #include &lt;math.h&gt; //даны...

Странное поведение gcc с sqrt() функцией
Писал для приятеля простую программку вычисления выражения,они работают под Linux,возник такой вопрос. Если написать что-то типа ...

Найти квадратный корень не используя Math и Sqrt
Помогите найти квадратный корень не используя Math и Sqrt.

Составить программу для вычисления значения sqrt
составить программу для вычисления значения sqrt(3+sqrt(6+...+sqrt(3*(n-1)+sqrt(3*n)))) с точностью до 10^-6


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru