Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Паскаль и NaN (http://forum.oszone.net/showthread.php?t=128870)

ManHack 16-01-2009 21:57 1009978

Паскаль и NaN
 
Здравствуйте!
Вобщем, нужно решить следующую задачу на Turbo Pascal'e v7.0:
Дано: переменная x типа single (var x: single;)
Что требуется: произвести некоторые действия в программе так, чтобы в конце своей работы она по команде writeln (x) выводила на экран именно надпись NaN (Not-a-Number).
Что нужно сделать с переменной X чтобы получить такой результат.
Делить на ноль естественно нельзя из-за ошибки Division by Zero.
Пробовал привести число к порядку 10^255 при неравной нулю мантисе числа - не получилось (все попытки приведения к порядку выше 10^30 заканчивались ошибкой).

pva 17-01-2009 01:18 1010181

а так если:
Код:

var x: single;
begin
  x := nan;
  writelen(x);
end;


DedAlex 17-01-2009 10:15 1010339

ManHack, в Delphi, NaN можно получить вот так
Код:

(1.0/0.0)/(1.0/0.0)
попробуйте, может и в Паскале сработатет.

Busla 17-01-2009 12:21 1010394

А если самостоятельно сконструировать в памяти необходимое значение переменной?
Если верить переводу официального руководства:
Код:

4-х байтовый (32-х битный) тип Single делится на три поля:
1        8        23
s        e        f
msb        lsb        msb        lsb


Значение числа v определяется как,

если 0 < e < 255, то v = (-1)**s x 2**(e-127) x (1.f).
если e = 0 и f <> 0, то v = (-1)**s x 2**(-126) x (0.f).
если e = 0 и f = 0, то v = (-1)**s x 0
если e = 255 и f = 0, то v = (-1)**s x Inf.
если e = 255 и f <> 0, то v = NaN.


Busla 17-01-2009 12:36 1010403

Вообще - добыть несколько нормальных справочников в электронном и поискать в них строку NaN. Она всплывёт в описаниях функций, будет указано в каких случаях получается такая ситуация. Преобразование строки в число по идее должно давать NaN. Извлечение корня из отрицательного числа.

ManHack 17-01-2009 18:43 1010736

Цитата:

если e = 255 и f <> 0, то v = NaN.
А как задать это самое single-число с полем e=255 ? у меня в этом поле больше 30 не помещается >.<

Код:

(1.0/0.0)/(1.0/0.0)
Erorr 140: Invalid floating point operator.

Код:

var x: single;
begin
  x := nan;
  writelen(x);
end;

Error 3: Unknown indefender

:(

Busla 17-01-2009 23:01 1011005

ManHack, ну примерно вот так:
Код:

var
  x: single;
  l: longint absolute x;

begin
 l:=2139095041;
 writeln (x);
end.

только, похоже, writeln не умеет возвращать NaN, т.к. получаем ошибку выполнения
207: Invalid floating point operation

ManHack 19-01-2009 19:54 1012987

Заранее известно, что задача выполнимая. На Паскале v7.0.
Неужели всё настолько сложно? :(

Busla 20-01-2009 13:40 1013756

ManHack, раз вам дают такие задачи, значит это разбиралось на лекциях или практиках - меньше надо было прогуливать.

Надеюсь, мы потом увидим правильное решение? ;)

ManHack 20-01-2009 15:57 1013881

Эту задачу дали "кому мозг охота сломать". Я не прогуливал. Честно-честно :)


Время: 05:49.

Время: 05:49.
© OSzone.net 2001-