Как задать бесконечность в c
Перейти к содержимому

Как задать бесконечность в c

  • автор:

Арифметика с символом бесконечности в С

Так это просто. Возьми в инете любую книгу по c++, почти в каждой есть классический пример: комплексное число. Чуть сложнее, если template использовать, но тогда будет и целочисленная и с плавающей запятой.Попробуй.

olegk ★★
( 18.03.06 22:42:13 MSK )
Ответ на: комментарий от olegk 18.03.06 22:42:13 MSK

Да ну нах. в каждой прогамме нужно умничать строго определенное число раз: у меня там перегружена операция сравнения для элементов очереди с приоритетами=) Так что все решается просто: заменой int на float и последующим приведением типов. По быдлокодерски канешна, зато работает вроде:)

Unforgiven ★
( 18.03.06 22:50:16 MSK ) автор топика

По-моему, ты ошибся в самой постановке задачи. Бесконечность нельзя рассматривать саму по себе в отрыве от её происхождения, это просто математически неправильно и ты сильно рискуешь получить неверный результат.

anonymous_incognito ★★★★★
( 19.03.06 02:08:36 MSK )

не знаю как это реализовано в си, но в питоне такое есть. ссылаются на IEEE-754: numarray.ieeespecial has support for manipulating IEEE-754 floating point special values NaN (Not a Number), Inf (infinity), etc. The special values are denoted using lower case as follows: >>> import numarray.ieeespecial as ieee >>> ieee.inf inf >>> ieee.plus_inf inf >>> ieee.minus_inf -inf >>> ieee.nan nan >>> ieee.plus_zero 0.0 >>> ieee.minus_zero -0.0 >>> a = array([0.0, 1.0]) >>> b = a/0.0 Warning: Encountered invalid numeric result(s) in divide Warning: Encountered divide by zero(s) in divide >>> b array([ nan, inf])

anonymous
( 19.03.06 02:55:45 MSK )
Ответ на: комментарий от anonymous_incognito 19.03.06 02:08:36 MSK

> Бесконечность нельзя рассматривать саму по себе в отрыве от её происхождения, это просто математически неправильно и ты сильно рискуешь получить неверный результат.

можно, но при этом необходимо вводить также nan

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

anonymous
( 19.03.06 03:00:01 MSK )
Ответ на: комментарий от anonymous_incognito 19.03.06 02:08:36 MSK

Вообщем, короче, у меня аогоритм Форда-Беллмана поика кратчайшего пути в сети: там прямо сам бог веле условиться, что дуги v-w не существует, то вес ее считается равным бесконечности. Не знаю, с чего я решил, что вес обязательно целый, так что бесконечность через float как раз вроде самое то.=)

Unforgiven ★
( 19.03.06 08:17:15 MSK ) автор топика
Ответ на: комментарий от Unforgiven 19.03.06 08:17:15 MSK

Решать тебе, но бесконечность и nan в float введены совсем для других целей, обработка этих значений на разных системах может делаться по-разному, надо следить, чтобы они не вызывали исключения и зачем это нужно? Заводишь, как обычно, матрицу 0 — ребра нет, 1 — имеется и отдельно веса.

Или тогда уж в качестве условной бесконечности взять очень большое, но представимое в float число — так поступать тоже не очень аккуратно, но работа с переполнениями чревата неожиданными ошибками и системнозависима.

anonymous_incognito ★★★★★
( 19.03.06 13:00:42 MSK )
Ответ на: комментарий от olegk 18.03.06 22:16:44 MSK

Свой класс в чистом C? Авторы жжут.

Целочисленная бесконечность? Пишуизпацстула. Такого не бывает.

fk0 ★
( 20.03.06 00:17:20 MSK )
Ответ на: комментарий от fk0 20.03.06 00:17:20 MSK

>Свой класс в чистом C? Авторы жжут.

Ты посмотри на код приведеный в начале и поймешь, что речь не о чистом C. Не верь всему, что написано.

olegk ★★
( 20.03.06 18:27:14 MSK )
Ответ на: комментарий от anonymous_incognito 19.03.06 13:00:42 MSK

> системнозависима.

Борланд и Майкрософт (студия последняя) не знают ни про какие INFINITY. Пришлось писать HUGE_VAL — арифметика правильная. Т.е. имеет место равенство: HUGE_VAL + HUGE_VAL == HUGE_VAL. компилится и там и там слава богу:)

Бесконечность double 1.#INF?

> Что из себя представляет это значение в памяти? ближайший гугл, IEEE 754 > Infinity The values +infinity and -infinity are denoted with an exponent of all 1s and a fraction of all 0s. The sign bit distinguishes between negative infinity and positive infinity. Being able to denote infinity as a specific value is useful because it allows operations to continue past overflow situations. Operations with infinite values are well defined in IEEE floating point.

21 мар 2015 в 20:59

Жаль нельзя минус поставить за коммент. На русский переводите, я же не на англ. форуме вопрос задаю. Хочется прочитать коммент на русском, а не ссылку на стандарт.

21 мар 2015 в 21:11

@manking ужасно. Вроде и ответ принес, но нет — недостаточно постарался, все-таки минус. Из чего состоит double/float? Из знака (1 бит), экспоненты (11/8 бит) и мантиссы (52/23 бит). Для значений «бесконечность» зарезервированы состояния, в которых все биты экспоненты выставлены в 1, а все биты мантиссы — в ноль. вики для стопроцентности ru.wikipedia.org/wiki/…

21 мар 2015 в 21:37

@Etki Вот так лучше. А как проверить на бесконечность, используя конструкции языка? Это возможно или нет?

21 мар 2015 в 22:02
@manking, без умения хотя бы читать и понимать английский Вам в сфере IT ничего не светит.
21 мар 2015 в 23:36

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Согласно стандарту языка C++, способ представления типов с плавающей точкой (floating-point types) определяется реализацией. Можно воспользоваться статическим членом is_iec559 шаблонного класса std::numeric_limits для проверки соответствия некоторого типа стандарту IEEE 754-2008:

std::numeric_limits::is_iec559 

Он равен true если тип соответствует требованиям IEEE 754-2008. Далее в ответе предполагается, что тип double удовлетворяет требованиям этого стандарта.

Так вот, если поделить 1.0 на 0.0 , то получится положительная бесконечность (Infinity). Один из возможных способов, которым реализация посредством std::cout может отобразить бесконечность — это 1.#INF .

Разность двух бесконечностей с одинаковым знаком — это NaN . Один из возможных способов, которым реализация посредством std::cout может отобразить NaN — это -1.#IND .

  1. Переменная ind в вашем примере равна NaN . NaN не равен ничему, включая самого себя. Вот почему выражение ind != ind равно true .
  2. Конструкцию if(ind != ind) можно использовать для проверки на NaN , но не на бесконечность. Начиная с C++11, в заголовочном файле есть функция std::isnan для проверки на NaN и функция std::isinf для проверки на бесконечность.
  3. И NaN ‘ы и бесконечности хранятся в памяти также как и все остальные числа с плавающей точкой: бит знака, биты экспоненты и биты мантиссы. Если все биты экспоненты установлены в 1 , а все биты мантиссы установлены в 0 , то это бесконечность (положительная или отрицательная, в зависимости от знакового бита). Если все биты экспоненты установлены в 1 , а среди битов мантиссы есть хотя бы один не нулевой, то это NaN .
  4. Операторы < , = , > возвращают false в случае, если по крайней мере один из операндов NaN . Поэтому все выражения ind < 5.4 , ind == 5.4 , ind >5.4 возвращают false . Бесконечности же сравниваются обычным образом: −Infinity < every_finite_number < +Infinity .

Стандарт языка C++ не особо требователен к типам с плавающей точкой. Многие аспекты поведения таких типов определяются реализацией. Например, стандарт IEEE 754-2008 разрешает, чтобы в случае, если один из операндов бинарного > — NaN , то генерировалось исключение.

При работе с числами с плавающей точкой, стоит помнить про возможные агрессивные оптимизации, которые компилятор может применить. Например, в Visual Studio, при использовании опции /fp:fast компилятор запросто может выражение pinf — pinf заменить нулём (что в случае, если pinf равен бесконечности или NaN — не верно), а выражение ind != ind заменить на false (что в случае, если ind равен NaN — не верно).

Как задать -бесконечность и +бесконечность в ограничения переменной объекта?

Используя [Range(from, to)], можно ограничить значения переменной между from и to значениями. Но в некоторых компонентах, например, CharacterController/Height или CharacterController/Radius, есть поля, которые ограничены не двумя, а одним значением. Как указать такое ограничение?

  • Вопрос задан более двух лет назад
  • 60 просмотров

Комментировать
Решения вопроса 1
Начинающий программист.

можешь задать граничное значение для данного типа переменной(больше или меньше, всёравно не сможешь).

Ответ написан более двух лет назад

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

Ответы на вопрос 0
Ваш ответ на вопрос

Войдите, чтобы написать ответ

unity

  • Unity
  • +1 ещё

Не работает логин через — (Google Sign In + Firebase), в чем может быть проблема?

  • 1 подписчик
  • 05 мая
  • 29 просмотров

Как задать и считать бесконечность?

Считываю матрицу из файла. Некоторые элементы равны бесконечности. Как записать в файл бесконечность, чтобы потом можно было считать их из файла как бесконечность?

  • Вопрос задан более трёх лет назад
  • 5381 просмотр

Комментировать

Решения вопроса 1

myjcom

Roman @myjcom Куратор тега C++

#include #include #include #include #include #include #include using namespace std; int main() < const string filein = "D:\\numbers_in.txt"; const string fileout = "D:\\numbers_out.txt"; vectorv; ios_base::sync_with_stdio(false); if(ifstream ifs(filein); ifs) < transform(istream_iterator, <>, back_inserter(v), [](const auto& xs)< double d = numeric_limits::infinity(); try < d = stod(xs); >catch(. ) < cout return d; >); > copy(v.begin(), v.end(), ostream_iterator); if(ofstream ofs(fileout); ofs) < copy(v.begin(), v.end(), ostream_iterator); > cin.get(); >

numbers_in.txt
-1.0 3.0e5 inf 23.01 55.003
numbers_out.txt
-1 300000 inf 23.01 55.003

Для матрицы

-1.0 3.0e5 inf 5.0 inf 0.008 1.45 3.99 -5.25

+/- Аналогично

#include #include #include #include #include #include #include #include using namespace std; auto parse_line = [](istream& is) < vectorrow; transform(istream_iterator, <>, back_inserter(row), [](const auto& xs)< double d = numeric_limits::infinity(); try < d = stod(xs); >catch(. ) < cout return d; >); return row; >; int main() < const string filein = "D:\\numbers_in.txt"; const string fileout = "D:\\numbers_out.txt"; vector matrix; ios_base::sync_with_stdio(false); if(ifstream ifs(filein); ifs) < string line; while(getline(ifs, line)) < istringstream is< line >; matrix.push_back(parse_line(is)); > > for(const auto& v : matrix) < copy(v.begin(), v.end(), ostream_iterator); cout if(ofstream ofs(fileout); ofs) < for(const auto& v : matrix) < copy(v.begin(), v.end(), ostream_iterator); ofs > cin.get(); >

А нужно написать бесконечность потому что потом буду искать минимальный элемент среди этих элементов и чтобы этот минус не мешал поиск.

минимальный элемент среди этих элементов

using Matrix = vector>; auto find_min = [](const Matrix& m) < vectorvalues; for(const auto& row : m) < values.push_back(*min_element(row.begin(), row.end())); >return *min_element(values.begin(), values.end()); >; // . cout 

Min element: -5.25

Ответ написан более трёх лет назад

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *