2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки





Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3
 
 Re: Си, вычисления
Сообщение20.10.2016, 21:45 
Заслуженный участник
Аватара пользователя


27/04/09
18809
Уфа
letovpowergameisover в сообщении #1161468 писал(а):
Странно, isfinite теперь просто печатается в консоли в любом случае, даже когда деления на 0 нет
Не понимаю, как заставить её проверять переменную "a"?
Применить isfinite к a. Получится выражение isfinite(a), которое будет иметь логическое значение, т. е. его можно засунуть в условный оператор: if (isfinite(a)) { ... } else { ... }.

А вообще нужен код, потому что я совсем не понимаю, как в языке без reflection’а может печататься строка "isfinite", если её только не засунуть прямо в строку формата, чего делать, разумеется, не надо, потому что строка формата — это обычная строка, куски которой не считаются выражениями языка.

 Профиль  
                  
 
 Re: Си, вычисления
Сообщение20.10.2016, 22:09 
Аватара пользователя


10/10/16
22
В общем решил, вроде бы, довольно смешно конечно
Но все должно работать
Код:
int main() {
   int n;
   double a;
   scanf("%lf%i", &a, &n);
   {
      if (a == -n)
         printf("Деление на 0 ");
//пример a = -3, n = 3
      else if (a == 0)
         printf("Деление на 0");
//пример a = 0
      else if (-a <= n)
//пример -2 3
         printf("Деление на 0");
      else
         printf("%.4f\n", FTWTRYHARD(a, n));
   }
   
   _getch();
}


-- 20.10.2016, 23:10 --

arseniiv в сообщении #1161473 писал(а):
letovpowergameisover в сообщении #1161468 писал(а):
Странно, isfinite теперь просто печатается в консоли в любом случае, даже когда деления на 0 нет
Не понимаю, как заставить её проверять переменную "a"?
Применить isfinite к a. Получится выражение isfinite(a), которое будет иметь логическое значение, т. е. его можно засунуть в условный оператор: if (isfinite(a)) { ... } else { ... }.

А вообще нужен код, потому что я совсем не понимаю, как в языке без reflection’а может печататься строка "isfinite", если её только не засунуть прямо в строку формата, чего делать, разумеется, не надо, потому что строка формата — это обычная строка, куски которой не считаются выражениями языка.

Да сам вообще не понимаю, на русском ничего внятного найти не могу про isfinite на Cи, да и в универе мы и близко <math.h> не проходили.
Глянь решение постом выше.

 Профиль  
                  
 
 Re: Си, вычисления
Сообщение20.10.2016, 22:57 
Заслуженный участник
Аватара пользователя


30/01/06
61278
letovpowergameisover в сообщении #1161442 писал(а):
В общем преподша никак не понимает, что деление при делении на 0 в консоли и так выдается "inf". Говорит мне, что бы я сделал так, что бы при делении на 0 программа так и писала, а не "inf"

Это разумное требование.

warlock66613 в сообщении #1161453 писал(а):
и понимания языковых конструкций

Тут, боюсь, потребуется нечто большее: знакомство с IEEE754 и POSIX.

 Профиль  
                  
 
 Re: Си, вычисления
Сообщение20.10.2016, 23:25 
Заслуженный участник
Аватара пользователя


27/04/09
18809
Уфа
Не важно, проходили ли math.h. :-) Если проходили, как вообще работают инклуды и заголовки, этого будет достаточно (все стандартные заголовки проходить ни в одном курсе не станут). Хотя, видимо, не проходили. А английский, увы, надо подтягивать. Сейчас документация там, где она существует, гарантированно будет, в основном, только на нём (худшие случаи: она будет на чём-то другом, но тогда ещё меньше шансов на русскоязычную; или её вообще не будет), и у многих вещей (в число которых стандарты C не входят) документация может обновляться так часто, что перевод будет легко и беззаботно устаревать, если только это не документация чего-то от какой-нибудь большой компании, имеющей достаточно ресурсов.

Код странный. Зачем, например, поместили условный оператор в блок? Там нет никаких определений, которые бы после закрытия блока вышли бы из области видимости, так что разницы с его отсутствием никакой. Далее, можно было три условия объединить логической операцией || (или). Наконец, последнее условие включает в себя первое: $-a\leqslant n \Leftrightarrow a\geqslant -n\Rightarrow a=-n$. И на самый конец, условия просто слишком сильные в любом случае, они зарубят и вполне приемлемые значения $a$. Например, для случая $(a,\;n) = (-2{,}5,\; 3)$.

Наконец, не всегда проверять корректность данных проще до вычислений, чем проверить корректность ответа после вычислений, когда они могут делаться с частично некорректными данными. Вот в этом случае если какой-то множитель $a+m$ окажется слишком близким к нулю, его результатом будет то самое специальное значение ±inf, при умножении на которое конечных чисел оно так и останется не-конечным-числом (может превратиться в NaN, может остаться бесконечностью того или другого знака), на которое проверить один раз результат может оказаться проще, чем проверить $a$ на неравенство всем $\{0,-1,\ldots,-n\}$.

Munin в сообщении #1161490 писал(а):
IEEE754
Слова о котором, как я понимаю, в подобных курсах тоже обычно обходят стороной. Увы. Хотя это не так много, если не вдаваться в детали (которые, правда, тоже нужно знать, даже если не собираешься отлаживать численные алгоритмы, потому что интересность — особенно если поддержка стандарта неполная, а она мало где полная, насколько помню — вылезет когда-нибудь всё равно).

 Профиль  
                  
 
 Re: Си, вычисления
Сообщение21.10.2016, 00:22 
Заслуженный участник
Аватара пользователя


02/08/11
4096
Munin в сообщении #1161490 писал(а):
Тут, боюсь, потребуется нечто большее: знакомство с IEEE754 и POSIX.
Не знаю при чём тут POSIX, а из IEEE754 надо знать только то, что double может быть "нормальным" (в обычном смысле слова, а не в том, который в IEEE) числом или "ненормальным" (плюс-минус бесконечность либо NaN), а как отличить одно от другого уже подсказали.

 Профиль  
                  
 
 Re: Си, вычисления
Сообщение21.10.2016, 02:53 
Заслуженный участник
Аватара пользователя


27/04/09
18809
Уфа

(Напомнили)

Вот, кстати, оно может быть ещё и субнормальным/денормализованным со своими потенциальными проблемами, которые описаны по ссылке, хотя в текущем контексте это не важно.

 Профиль  
                  
 
 Re: Си, вычисления
Сообщение21.10.2016, 11:43 


27/08/16
779
Возможно, преподаватель хочет, чтобы студент проверял знаменатель на равенство нулю перед делением. Так обычно делают при использовании целочисленной арифметики. Тогда нужно, сделав как хочет преподаватель и сдав работу, так больше никогда не делать. В плавающей арифметике возможно возникновение переполнения при делении и не на нуль. Нечисловые значения введены в форматы плавающих чисел совершенно неслучайно.

 Профиль  
                  
 
 Re: Си, вычисления
Сообщение21.10.2016, 21:34 
Заслуженный участник
Аватара пользователя


30/01/06
61278
warlock66613 в сообщении #1161509 писал(а):
Не знаю при чём тут POSIX, а из IEEE754 надо знать только то, что double может быть "нормальным" (в обычном смысле слова, а не в том, который в IEEE) числом или "ненормальным" (плюс-минус бесконечность либо NaN), а как отличить одно от другого уже подсказали.

Надо ещё знать, что inf и NaN - это не единичные значения, а классы значений. Так что, например, сравнивать на inf нельзя наивно как
    if (x == 1/0.0)

-- 21.10.2016 21:36:53 --

realeugene в сообщении #1161567 писал(а):
Возможно, преподаватель хочет, чтобы студент проверял знаменатель на равенство нулю перед делением.

Разумеется.

realeugene в сообщении #1161567 писал(а):
Тогда нужно, сделав как хочет преподаватель и сдав работу, так больше никогда не делать.

Нет, наоборот: надо делать так всегда, только не на нуль, а на попадание в $\varepsilon$-окрестность нуля.

-- 21.10.2016 22:23:11 --

warlock66613 в сообщении #1161509 писал(а):
Не знаю при чём тут POSIX

Ну, я не знал, что соответствующие функции уже в math.h внесли (а вот и нет! в старые стандарты не внесли). А в POSIX они давно уже были.

 Профиль  
                  
 
 Re: Си, вычисления
Сообщение21.10.2016, 22:23 
Заслуженный участник
Аватара пользователя


02/08/11
4096
Munin в сообщении #1161739 писал(а):
Нет, наоборот: надо делать так всегда, только не на нуль, а на попадание в $\varepsilon$-окрестность нуля.
Не надо так делать всегда. Так надо делать только если это имеет смысл в конкретном случае для конкретного алгоритма (и вы точно знаете чему в таком случае равно $\varepsilon$).

 Профиль  
                  
 
 Re: Си, вычисления
Сообщение21.10.2016, 22:38 
Заслуженный участник
Аватара пользователя


27/04/09
18809
Уфа
Munin в сообщении #1161739 писал(а):
Так что, например, сравнивать на inf нельзя наивно как if (x == 1/0.0)
Ага. И даже если бы NaN был единственным значением, по стандарту он должен быть не равен сам себе, что восхитительно. И раз уж мы всё же ударились в стандарт, надо упомянуть и отрицательный ноль, который, наоборот, равен положительному, но при делении на него получится бесконечность другого знака etc. etc..

Munin в сообщении #1161739 писал(а):
а на попадание в $\varepsilon$-окрестность нуля
Кстати, эпсилоны тоже вещь непростая… Одно дело — то, что действительно зовётся эпсилоном — наибольшее $x$ такое, что $1=1+x$. Другое — вот это число, на которое надо проверять. Ещё есть третье, не помню что, и, кажется, на этом всё не заканчивается.

 Профиль  
                  
 
 Re: Си, вычисления
Сообщение21.10.2016, 22:42 
Заслуженный участник
Аватара пользователя


30/01/06
61278
warlock66613
Ну, это уже высокий профессионализм :-) Для начала, надо научиться так делать всегда. А потом уже - набираться мудрости :-)

-- 21.10.2016 22:43:55 --

arseniiv в сообщении #1161753 писал(а):
Одно дело — то, что действительно зовётся эпсилоном — наибольшее $x$ такое, что $1=1+x$.

Нет, здесь нужен не "машинный эпсилон", а "задачный эпсилон".

 Профиль  
                  
 
 Re: Си, вычисления
Сообщение21.10.2016, 22:45 
Заслуженный участник
Аватара пользователя


27/04/09
18809
Уфа
Так я не говорил, что это нужный эпсилон, но его же так зовут, и кто-то мог бы перепутать.

Давайте, раз тут такое обсуждение, я тогда здесь упомяну знаменитую главу из какой-то книги, которая давно плавает отдельно и была раньше статьёй (Дэвида Голдберга):
(Google) What Every Computer Scientist Should Know About Floating-Point Arithmetic

(PDF качеством формул лучше варианта на сайте Oracle. PDF главы занимает 4,6 MiB. В результатах поиска ещё и исходная статья попадается, которую я не взвешивал.)

Она явно небесполезна, и здесь её будет просто найти.

 Профиль  
                  
 
 Re: Си, вычисления
Сообщение21.10.2016, 23:08 


27/08/16
779
Munin в сообщении #1161739 писал(а):
Нет, наоборот: надо делать так всегда, только не на нуль, а на попадание в $\varepsilon$-окрестность нуля.

Сами найдёте такое x, что isfinite(x) && !isfinite(x/0.99)?

 Профиль  
                  
 
 Re: Си, вычисления
Сообщение10.11.2016, 12:58 


13/12/15

91
letovpowergameisover в сообщении #1159451 писал(а):
Изучаю Си месяц со странными преподами в универе, поэтому все так.

Для изучения советую книги по C с примерами: рекомендую книгу Харбисон С.П., Стил Г.Л. Язык C с примерами (американский оригинал выдержал несколько изданий и считается авторитетным справочником из категории бестселлеров).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 44 ]  На страницу Пред.  1, 2, 3

Модераторы: Toucan, maxal, Karan, PAV, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group