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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2009, 14:57   #1
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию Неожиданный результат

Может кто-нибудь прокомментировать столь странный(как вы увидите) вывод программы?
Код:
program Project18;

{$APPTYPE CONSOLE}

var
   v : double;

begin

   v := 1.7e308;

   writeln(1.7e308 - v);

end.
Впрочем, у меня в программе выражение 1.7e308 - v является частью более сложного выражения, только вот результат один и тот же - где-то 6.11e291.
megachuhancer вне форума Ответить с цитированием
Старый 16.08.2009, 15:19   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

используй extended
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.08.2009, 15:35   #3
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

До этого я мог и сам додуматься. Мне интересно, почему именно приведенный выше код выдает именно такой результат. Понятно, что само выражение 1.7e308 имеет тип extended, неясно почему результат выражения 1.7e308 - v такой, как было показано выше. Разве тип всего выражения не приводится к "наибольшему" типу? Или, если в выражении константа и переменная, тип всего выражения приводится к типу переменной, в данном случае к типу double? Но ведь 0, он и в extended'е и в double 0... А максимальное значение double, если верить мануалу - это как раз 1.7e308.

Последний раз редактировалось megachuhancer; 16.08.2009 в 15:38.
megachuhancer вне форума Ответить с цитированием
Старый 16.08.2009, 15:49   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

как я понял типы extended и double не очень совместимы
(8байт и 10байт...мне кажется причина кроется тут)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.08.2009, 15:54   #5
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

То есть их нельзя использовать в одном выражении?
Код:
program Project18;

{$APPTYPE CONSOLE}

var
   v : double;

begin

   v := 2;

   writeln(v + 2.0);

end.
работает вполне нормально.
Да и непонятно вот что: выражение 1.7e308 - v имеет вполне определенный тип. Поэтому даже если 0 в extended - это 6.11e291 в double , writeln выводит значение вполне определенного типа.
megachuhancer вне форума Ответить с цитированием
Старый 16.08.2009, 16:08   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
var d:extended;
     v:double;

begin
 v:=1.7e308;
 d:=extended(v);
 writeln(d);
 readln;
end.
не компилится...а ведь Дельфи похоже всетаки приводит эти типы...потому и получается бред(в extended же иная структура хранения числа)
так тоже не то выходит:
Код:
var d:extended;
    v:double;

begin
 v:=1.7e308;
 d:=v-1.7e308;
 writeln(d);
 readln;
end.
вот так вполне норм...но помоему результат то не тот:
Код:
var d:extended;
    v:double;

begin
 v:=1.7e150;
 d:=v-1.7e130;
 writeln(d);
 readln;
end.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.08.2009, 16:13   #7
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Даааа.... Присвоить можно, typecast нельзя сделать...
megachuhancer вне форума Ответить с цитированием
Старый 16.08.2009, 16:21   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

поэтому придется переводить через присваивание
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.08.2009, 00:08   #9
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

В первом случае преобразование выполняет компилятор, во втором - FPU.
Компилятор получает 73 B2 DB B9 83 89 16 F2 FE 43.
FPU получает 00 B0 DB B9 83 89 16 F2 FE 43.
Оба они выводятся как 1.7e308, но разность их примерно 6.11E+0291. Возникает это, похоже, из-за глюка компилятора в преобразовании. А вот почему разность такая... Это надо разбираться с представлением вещественных чисел.

Последний раз редактировалось Somebody; 17.08.2009 в 00:10.
Somebody вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
результат запроса Ko$tello БД в Delphi 7 18.04.2012 12:13
Не тот результат! Dawystrik Общие вопросы Delphi 3 22.03.2009 09:50
неожиданный вопрос :) Exo Microsoft Office Excel 10 04.05.2008 11:06
Результат прогресса Stilet Свободное общение 10 15.04.2008 13:03
Turbo C:не видно результат. Trewert Помощь студентам 5 07.09.2007 00:10