Показать полную графическую версию : Паскаль и 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 заканчивались ошибкой).
а так если:
var x: single;
begin
x := nan;
writelen(x);
end;
ManHack, в Delphi, NaN можно получить вот так(1.0/0.0)/(1.0/0.0) попробуйте, может и в Паскале сработатет.
А если самостоятельно сконструировать в памяти необходимое значение переменной?
Если верить переводу официального руководства (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.
Вообще - добыть несколько нормальных справочников в электронном и поискать в них строку NaN. Она всплывёт в описаниях функций, будет указано в каких случаях получается такая ситуация. Преобразование строки в число по идее должно давать NaN. Извлечение корня из отрицательного числа.
если 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
:(
ManHack, ну примерно вот так:
var
x: single;
l: longint absolute x;
begin
l:=2139095041;
writeln (x);
end.
только, похоже, writeln не умеет возвращать NaN, т.к. получаем ошибку выполнения
207: Invalid floating point operation
Заранее известно, что задача выполнимая. На Паскале v7.0.
Неужели всё настолько сложно? :(
ManHack, раз вам дают такие задачи, значит это разбиралось на лекциях или практиках - меньше надо было прогуливать.
Надеюсь, мы потом увидим правильное решение? ;)
Эту задачу дали "кому мозг охота сломать". Я не прогуливал. Честно-честно :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.