![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
varra |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 27.3.2003 Где: Новосибирск Репутация: нет Всего: нет |
пусть T=0, S=10, s1 = 4 как определить,когда s1 выйдет за пределы разрядной сетки? |
|||
|
||||
x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 19 Всего: 22 |
tmp := s1;
s1 := s1/2; if tmp = s1 then ... -------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
А можно так:
При ПРС в меньшую сторону число становится равным нулю... -------------------- С уважением, г-н Посол. |
|||
|
||||
Dmitry V.Abramov |
|
||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 30.9.2003 Где: Saint-Petersburg Репутация: 5 Всего: 4 |
А НЕправильнее так: (пример оставлен, дабы было стыдно за свой старческий маразм)
Это не прикол. Это корректная работа с экстремальными числами в FPU. Это сообщение отредактировал(а) Dmitry V.Abramov - 9.10.2003, 22:54 --------------------
/DVA |
||||||
|
|||||||
x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 19 Всего: 22 |
круто
![]() только все равно непонятно, чем 0/0 корректнее 0 с точки зрения компилятора ![]() -------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
Dmitry V.Abramov |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 30.9.2003 Где: Saint-Petersburg Репутация: 5 Всего: 4 |
1. 2. 3. 0/1 = 0. В то время, как NaN/1 инициализирует raise EUnderFlow 4. FPU знает про NaN. 5. Что-то есть еще, но никак не припомнить... ============ Спасибо p0s0l за своевременные указания на старческий склероз. Это сообщение отредактировал(а) Dmitry V.Abramov - 9.10.2003, 22:51 --------------------
/DVA |
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Dmitry V.Abramov, к сожалению, вы ошибаетесь (частично).
Я согласен, что с числами в форме с ПЗ надо работать аккуратно. Но NaN это не то, что вы думаете. NaN - это не число! И это близко не 0! При переполнении ПРС в меньшую сторону получается 0, а не NaN, как вы думаете !!! А при переполении в большую сторону получается Infinity или NegInfinity ! NaN + 5 = NaN NaN * 2 = NaN и т.д. NaN не должно участвовать в операциях сравнения. И если в том цикле while сделать проверку: if s1 = NaN then Break; то Break сработает при первом же проходе, т.к. NaN равен ЛЮБОМУ другому числу, в том числе и бесконечности! Так что придется оставить мой вариант... Это сообщение отредактировал(а) p0s0l - 9.10.2003, 22:01 -------------------- С уважением, г-н Посол. |
|||
|
||||
Dmitry V.Abramov |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 30.9.2003 Где: Saint-Petersburg Репутация: 5 Всего: 4 |
Виноват. Чушь спорол. Вспомнил давние розыски нестабильной ошибки при работе с fpu... и спорол. Более того, NaN в Delphi лучше вообще не трогать - Exception гарантирован.
Обязательно. Спасибо за бдительность! --------------------
/DVA |
||||
|
|||||
varra |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 27.3.2003 Где: Новосибирск Репутация: нет Всего: нет |
p0s0l, сэнкс
![]() а ведь еще до переполнения возникает ситуация, когда s1 становится настолько малым, что перестает влиять на сумму T... при S=10, s1 = 4 у меня это срабатывает на 39 шаге (переполнение - где-то на 1077), если отслеживать T в окне отладки (становится = 8,причем без какой-либо дробной части...). однако программно получаю 54й шаг :
Это сообщение отредактировал(а) varra - 10.10.2003, 05:47 |
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Dmitry V.Abramov, не стоит так уж сильно переживать! Любой может ошибиться, для того и форум, чтобы можно было не боясь высказывать своё мнение. Если что, дак другие подправят.
Так что всё нормально! Насчет NaN (NaN = Not a Number): Infinity/Infinity=NAN Infinity-Infinity=NAN Любые операции с NAN = NAN Кстати, есть +NAN и -NAN... varra, а с этим уже ничего не поделаешь. Если буди использовать другой тип, Double или Extended - они оттянут этот момент... На мантиссу в Single(=Real) отводится 52 бита. Поэтому, при сложении 8 и 2^-52 результат никак не влезет в мантиссу, (т.к. между старшей единицей и младшей должно быть около 54 нулей), поэтому отбрасывается младшая часть результата... -------------------- С уважением, г-н Посол. |
|||
|
||||
Unregistered |
|
|||
Unregistered |
меня теперь интересует, почему прога выдает i_small = 54, в то время как я при отладке вижу в Watch, что сумма Т перестает увеличиваться на 39(!) шаге...
|
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Потому что тебе показывают округленно (Default).
Чтобы показывалось что есть на самом деле, щелкни на Ватче, который показывает значение T, и выбери тип отображения Floating Point... -------------------- С уважением, г-н Посол. |
|||
|
||||
varra |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 27.3.2003 Где: Новосибирск Репутация: нет Всего: нет |
спасибо тебе, p0s0l
а задачка была про чертей, усаживающихся на игле ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |