Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Машинная арифметика


Автор: PRF 16.4.2008, 00:22
Здрасти. Помогите пожалуйста найти в Делфи машинную бесконечность (т.е максимальное представимое число в типе single, double, extende), как найти это числа алгоритмически??

Автор: Fedia 16.4.2008, 04:33
Из справки
const MaxDouble: Extended = 1.7e+308;
const MaxSingle: Extended = 3.4e+38;
const MaxExtended: Extended = 1.1e+4932;
Цитата

как найти это числа алгоритмически?? 

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

Автор: Poseidon 16.4.2008, 10:24
Цитата(Fedia @  16.4.2008,  04:33 Найти цитируемый пост)
Добавлять к переменной определенного типа значение в цикле, до тех пор пока не получишь ошибку, результат последней, успешно прошедшей операции сложения будет приближенно равным максимальному значение типа переменной.
Фигасе алгоритм smile

Для целочисленных типов можно использовать функции High и Low

Код
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(High(Integer)));
end;

Автор: EvilsInterrupt 16.4.2008, 11:13
Poseidon, А че тебе алгоритм- то не нравится ? )))) Результат есть же! ;))))

Автор: Frees 16.4.2008, 12:00
Цитата(Poseidon @  16.4.2008,  10:24 Найти цитируемый пост)
Для целочисленных типов можно использовать функции High и Low

для этих типов 
Цитата(PRF @  16.4.2008,  00:22 Найти цитируемый пост)
т.е максимальное представимое число в типе single, double, extende


код не заработает



Автор: Alexeis 16.4.2008, 12:15
  можно взять единицу и удвоить, затем полученное опять удвоить, и так до тех пор пока не возникнет исключение. 

Автор: PRF 16.4.2008, 15:53
я так и делал(увеличивал единицу), вот только Делфи не поддерживает переполнение типа (как например в с++) и тот код который работает на с++, не работате на Делфи. Пишет, что переполнение вещественного типа (floating pointer overflow) - вроде так.

Автор: Mayk 17.4.2008, 07:59
Цитата(PRF @  16.4.2008,  19:53 Найти цитируемый пост)
я так и делал(увеличивал единицу), вот только Делфи не поддерживает переполнение типа (как например в с++) и тот код который работает на с++, не работате на Делфи. Пишет, что переполнение вещественного типа (floating pointer overflow) - вроде так. 

Это который? Операции типа 1.0/0.0? Вот http://www.delphibasics.co.uk/RTL.asp?Name=Infinity говорят что 1.0 / 0.0 работает.

Если не получится, то действтовать можно в лоб - посмотреть что записано в inf'е в с++, например так
Код

float x=1.0/0.0;
assert(sizeof(float)==sizeof(int));
printf("%x\n", x);

и переписать эти байты в single'овую переменную в дельфи(как - не скажу).


А вот тут

Цитата(http://cc.codegear.com/download.aspx?id=13767&file=NaN.htm&ln=1)

The value of "z" above is still 5.0 since the EZeroDivide exception was not captured. Here's how to capture the exception and assign a PositiveInfinity result using a function in the IEEE754 unit.
// Here's how to assign an INF to the result of a EZeroDivide
TRY
  z := x / y;
EXCEPT
  // Do not confuse with integer EDivByZero
  ON EZeroDivide DO z := PositiveInfinity
END;

грят что в дельфи есть PositiveInfinity.


Автор: DeadMage 17.4.2008, 17:48
Для целочисленных можно расчитать, умножить sizeof(integer), sizeof(cardinal), ... на то ли 16^2 то ли еще что-то, ну вы меня поняли...smile
PS:а может так:16^sizeof(xxx)? 

Автор: ivan219 17.4.2008, 20:36
Цитата(DeadMage @  17.4.2008,  17:48 Найти цитируемый пост)
PS:а может так:16^sizeof(xxx)? 

Скорее так: 2^8 * SizeOf(xxxx) (/ 2 если со знаком)

Автор: Esperito 18.4.2008, 19:53
Найти - в модуле Math.pas:
Код

  Infinity    =  1.0 / 0.0;
  (*$EXTERNALSYM Infinity*)
  (*$HPPEMIT 'extern const Extended Infinity /*= 1.0 / 0.0*/;'*)
  NegInfinity = -1.0 / 0.0;
  (*$EXTERNALSYM NegInfinity*)
  (*$HPPEMIT 'extern const Extended NegInfinity /*= -1.0 / 0.0*/;'*)

Алгоритмически - как описано в Math.pas, т.е. 1.0 / 0.0. Бесконечность по стандарту числа с плавающей точкой - это особый вид числа и, имхо, математическими операциями с числом с плавающей точкой его никак не получишь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)