Войти

Показать полную графическую версию : Паскаль и NaN


ManHack
16-01-2009, 21:57
Здравствуйте!
Вобщем, нужно решить следующую задачу на 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
а так если:

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

DedAlex
17-01-2009, 10:15
ManHack, в Delphi, NaN можно получить вот так(1.0/0.0)/(1.0/0.0) попробуйте, может и в Паскале сработатет.

Busla
17-01-2009, 12:21
А если самостоятельно сконструировать в памяти необходимое значение переменной?
Если верить переводу официального руководства (http://sizov.boom.ru/books/turbo6/tpasg.htm):
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
Вообще - добыть несколько нормальных справочников в электронном и поискать в них строку NaN. Она всплывёт в описаниях функций, будет указано в каких случаях получается такая ситуация. Преобразование строки в число по идее должно давать NaN. Извлечение корня из отрицательного числа.

ManHack
17-01-2009, 18:43
если 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
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
Заранее известно, что задача выполнимая. На Паскале v7.0.
Неужели всё настолько сложно? :(

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

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

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




© OSzone.net 2001-2012