2014 dxdy logo

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

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




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


27/04/09
28128
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
72407
letovpowergameisover в сообщении #1161442 писал(а):
В общем преподша никак не понимает, что деление при делении на 0 в консоли и так выдается "inf". Говорит мне, что бы я сделал так, что бы при делении на 0 программа так и писала, а не "inf"

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

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

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

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


27/04/09
28128
Не важно, проходили ли 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
7003
Munin в сообщении #1161490 писал(а):
Тут, боюсь, потребуется нечто большее: знакомство с IEEE754 и POSIX.
Не знаю при чём тут POSIX, а из IEEE754 надо знать только то, что double может быть "нормальным" (в обычном смысле слова, а не в том, который в IEEE) числом или "ненормальным" (плюс-минус бесконечность либо NaN), а как отличить одно от другого уже подсказали.

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


27/04/09
28128

(Напомнили)

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

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


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

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


30/01/06
72407
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
7003
Munin в сообщении #1161739 писал(а):
Нет, наоборот: надо делать так всегда, только не на нуль, а на попадание в $\varepsilon$-окрестность нуля.
Не надо так делать всегда. Так надо делать только если это имеет смысл в конкретном случае для конкретного алгоритма (и вы точно знаете чему в таком случае равно $\varepsilon$).

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


27/04/09
28128
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
72407
warlock66613
Ну, это уже высокий профессионализм :-) Для начала, надо научиться так делать всегда. А потом уже - набираться мудрости :-)

-- 21.10.2016 22:43:55 --

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

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

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


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

Давайте, раз тут такое обсуждение, я тогда здесь упомяну знаменитую главу из какой-то книги, которая давно плавает отдельно и была раньше статьёй (Дэвида Голдберга):
(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
10195
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

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



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

Сейчас этот форум просматривают: Bing [bot]


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

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