Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2008, 06:47   #1
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию NaN in Math

Вот на что наткнулся в модуле Math:
Код:
const

...

  { The following constants should not be used for comparison, only
    assignments. For comparison please use the IsNan and IsInfinity functions
    provided below. }
  NaN         =  0.0 / 0.0;
  (*$EXTERNALSYM NaN*)
  (*$HPPEMIT 'static const Extended NaN = 0.0 / 0.0;'*)
  Infinity    =  1.0 / 0.0;
  (*$EXTERNALSYM Infinity*)
  (*$HPPEMIT 'static const Extended Infinity = 1.0 / 0.0;'*)
  NegInfinity = -1.0 / 0.0;
  (*$EXTERNALSYM NegInfinity*)
  (*$HPPEMIT 'static const Extended NegInfinity = -1.0 / 0.0;'*)
Что это такое и счем это едят? Вроде понятно, но хотелось бы услышать еще мнения.
Sibedir вне форума Ответить с цитированием
Старый 03.03.2008, 11:22   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

И вновь - просто поразительная лень!
Для чего умные люди выложили в интернете множественные объяснения?
http://www.delphisources.ru/pages/fa...IsNaN.php.html
mihali4 вне форума Ответить с цитированием
Старый 03.03.2008, 14:29   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Да нет, mihali4, это не лень. Естественно, что подобное приминение NaN - это первое, что я встретил в нэте. Просто возникло любопытство, а как еще люди пользуются этой возможностью, так сказать, кто во что гаразд.
Я когда этот NaN увидел, сначала до глудены моей души был возмущен такой безтактной постановкой вопроса. Эт значит нам делить на ноль нельзя, а ему можно . Стал гадать, как этой вновь открывшейся тайной за семью печатями () воспользоватся на полную катушку. Решил наверстать упущенное, так сказать. Заодно спросил на форуме. Но моей фантазии ни на что интересное не хватило. Эт я от волнения придал этому факту такое значение, но теперь вижу - гадится этот NaN только для указания на невозможность операции.
Но вот вопрос, это что такое получается? Перед любой арифметической операцией сначала идет проверка: А не с NaN'ом ли мы работаем? Не влияет ли это на скорость вычислений?

Последний раз редактировалось Sibedir; 03.03.2008 в 14:41.
Sibedir вне форума Ответить с цитированием
Старый 03.03.2008, 14:58   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Sibedir, вообще на ноль "делить" как бы не возбраняется - однородные координаты, например. И потом в машинном представлении вещественных чисел самые крайние значения всегда обозначали бесконечности.
B_N вне форума Ответить с цитированием
Старый 03.03.2008, 15:01   #5
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Sibedir, вообще на ноль "делить" как бы не возбраняется - однородные координаты, например. И потом в машинном представлении вещественных чисел самые крайние значения всегда обозначали бесконечности.
Вот и верь после этого препадам в универе и книжкам типа "Delphi для чайников".

Ну а на скорость это все-таки влияет или нет?
Sibedir вне форума Ответить с цитированием
Старый 03.03.2008, 15:07   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Во чё придумал:
Код:
type
  TArrExtended = array [0..9] of Byte;
var
  e: Extended;
begin
  e := NaN;
  TArrExtended(e)[6] := 0;
  ShowMessage (FloatToStr (e));
end;
Такая нехитрая запись показывает, что можно написать функцию, которая, используя с 0 по 6 байт типа Extended, вернет не только NaN, но и например код ошибки. То же самое можно провернуть и с другими типами.

Хм, а вы говорили.
Sibedir вне форума Ответить с цитированием
Старый 03.03.2008, 15:21   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Ну здесь, насколько я понимаю, не ничего общего с "настоящим" делением. Просто оператор, имеющий "привычную" форму, а в математике ведь запись 1/0 не является чем-то экстраординарным, когда известно, что под ней подразумевается не арифметика. Да и делить на ноль не то чтобы "нельзя", а, скорее, "не имеет смысла". Оператор этот эдесь скорее всего выполняет просто несколько сравнений и к обычному делению, конечно, не имеет отношения, посмотрите отладчиком.
-----------------------
Ну и до кучи:
http://en.wikipedia.org/wiki/Double_precision (обратите внимание, к чему применяется infinity)
http://en.wikipedia.org/wiki/NaN

Последний раз редактировалось B_N; 03.03.2008 в 15:25.
B_N вне форума Ответить с цитированием
Старый 03.03.2008, 15:37   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Я был не понят.
Sibedir вне форума Ответить с цитированием
Старый 03.03.2008, 15:43   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Я был не понят.
Ну значит Вы плохо объяснили, что имеете в виду. NaN - это просто запись, обозначающая бесконечность и ей соответствует вполне определенный битовый набор в представлении чисел... Что не так?
B_N вне форума Ответить с цитированием
Старый 03.03.2008, 16:09   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Вот Вам еще пример - пишу вот такю "программу":
Код:
.............
double d = 1;
d /= 0;
............
Компилятор это мало волнует, он говорит только "warning C4723: potential divide by 0". "Программа" прекрасно выполняется, после деления переменная d выглядит таким образом:
Код:
00 00 00 00 00 00 f0 7f
- бесконечность.
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Math Zeraim Общие вопросы Delphi 7 04.06.2008 23:47