Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Машинная арифметика 
:(
    Опции темы
PRF
Дата 16.4.2008, 00:22 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.10.2007

Репутация: нет
Всего: нет



Здрасти. Помогите пожалуйста найти в Делфи машинную бесконечность (т.е максимальное представимое число в типе single, double, extende), как найти это числа алгоритмически??
PM MAIL   Вверх
Fedia
Дата 16.4.2008, 04:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: 8
Всего: 13



Из справки
const MaxDouble: Extended = 1.7e+308;
const MaxSingle: Extended = 3.4e+38;
const MaxExtended: Extended = 1.1e+4932;
Цитата

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

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


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
Poseidon
Дата 16.4.2008, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



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

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

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



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
EvilsInterrupt
Дата 16.4.2008, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 3
Всего: 9



Poseidon, А че тебе алгоритм- то не нравится ? )))) Результат есть же! ;))))
PM MAIL WWW ICQ Jabber   Вверх
Frees
Дата 16.4.2008, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



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

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


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





--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Alexeis
Дата 16.4.2008, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
PRF
Дата 16.4.2008, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 13.10.2007

Репутация: нет
Всего: нет



я так и делал(увеличивал единицу), вот только Делфи не поддерживает переполнение типа (как например в с++) и тот код который работает на с++, не работате на Делфи. Пишет, что переполнение вещественного типа (floating pointer overflow) - вроде так.
PM MAIL   Вверх
Mayk
Дата 17.4.2008, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: нет
Всего: 134



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

Это который? Операции типа 1.0/0.0? Вот тут говорят что 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.




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
DeadMage
Дата 17.4.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



Для целочисленных можно расчитать, умножить sizeof(integer), sizeof(cardinal), ... на то ли 16^2 то ли еще что-то, ну вы меня поняли...smile
PS:а может так:16^sizeof(xxx)? 
PM MAIL   Вверх
ivan219
Дата 17.4.2008, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



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

Скорее так: 2^8 * SizeOf(xxxx) (/ 2 если со знаком)
PM MAIL ICQ   Вверх
Esperito
Дата 18.4.2008, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 2.9.2007

Репутация: 1
Всего: 3



Найти - в модуле 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. Бесконечность по стандарту числа с плавающей точкой - это особый вид числа и, имхо, математическими операциями с числом с плавающей точкой его никак не получишь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1354 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.