LINUX.ORG.RU

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


0

0

Пример:

#include <iostream>
#include <math.h>

using namespace std;
int main()
{
 int i = (int) INFINITY;
 cout << i+i << endl;
 return 1;
};

На выходе получаем "-2". 
По реализуемому алгоритму очень выгодно использовать условную 
бесконечность: т.е. самое главное, что нужно --- это выполнение 
привычных известных правил арифметики типа "бесконечность + 
бесконечность == бесконечность". Причем еще и целочисленная 
бесконечность. Как такого добиться? Если объявить i типом float, то
вот тогда все работоает корректно.
Ответ на: комментарий от Unforgiven

>ой, а проще никак?=)

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

olegk ★★
()
Ответ на: комментарий от olegk

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

Unforgiven
() автор топика

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

anonymous_incognito ★★★★★
()

не знаю как это реализовано в си, но в питоне такое есть.
ссылаются на 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
()
Ответ на: комментарий от anonymous_incognito

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

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

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

anonymous
()
Ответ на: комментарий от anonymous_incognito

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

Unforgiven
() автор топика
Ответ на: комментарий от Unforgiven

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

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

anonymous_incognito ★★★★★
()
Ответ на: комментарий от olegk

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

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

fk0
()
Ответ на: комментарий от fk0

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

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

olegk ★★
()
Ответ на: комментарий от anonymous_incognito

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

+10^10

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

Unforgiven
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.