Перейти к содержанию

вещественный тип округляется


Рекомендуемые сообщения

Помогите пожалуйста

Задача такова:

возвести число a в степень n

На первый взгляд задача легкая, но я столкнулся с проблемой

Вот мой код:

program power;

{$N+}

var a,n:integer;

S:double;

begin

assign(input,'power.in');

reset(input);

assign(output,'power.out');

rewrite(output);

S:=1;

read(a,n);

while n<>0 do

begin

S:=S*a;

n:=n-1;

end;

write(S:0:0);

end.

при более менее маленьких значениях a и n программа работает,

но при a=5 и n=50 в файл power.out выводится число 88817841970012530000000000000000000

однако верный ответ 88817841970012523233890533447265625

в инете прочитал, что вещественные типы округляются в дробных частях чисел, а здесь дробной части нет, что делать?

Ссылка на комментарий

Ну вообще если в твоей записи нет дроби это не значит что ее вообще нет.

Здесь по видимому компилятор оперирует не

88817841970012530000000000000000000

88817841970012523233890533447265625

а

8881784197001253x10^19

8881784197001252,3233890533447265625x10^19

как это обойти в пакале? хз.

Стандартная функция для степени почему не катит?

Если нужет бесконечный порядок то

S:=S*a не подойдет,

ищи алкоритмы по умножению длинных чисел

Ссылка на комментарий

   man22, прежде чем в лес ходить - уточни у преподавателя надо ли это делать? У тебя число получается больше, чем может сохранить тип double. Если делать надо - то почитай примерно тут: http://forum.pascal.net.ru/index.php?showtopic=2428

Ссылка на комментарий
У тебя число получается больше, чем может сохранить тип double.

А я почитал, что как то так

Длина числового типа данных, 8 байт

Количество значащих цифр числового типа данных 15..16

Диапазон десятичного порядка числового типа данных -324..+308

??? Где правда

то есть это в районе 10^308 а он явно это не перепутал.

А если бы перепутал, проявилось бы это скорее в -отрицательном значении, а не в отбрасывании чисел))

Ссылка на комментарий

   nonlux, одно другому не мешает. Ты можешь запомнить 16 значащих цифр (как и видно из примера топикстартера), но все остальные значащие цифры не запоминаются в числе, в то время как порядок числа запоминает больше чем 16 степень. Поэтому первые 16 цифр запоминаются, остальные запоминаются как просто 10^n.

   Т.о. в памяти число запоминается как 8,881784197001253*10^33. Если возвести в степень, то и получатся нули после первых 16 цифр.

   Предлагаю использовать тип comp.

Ссылка на комментарий

TolkienDRR,nonlux, спасибо за помощь) да я не с преподователем занимаюсь, а сам)

попробовал тип comp, выдает ошибку 207:invalid floating point operation

меняю тип обратно на double, все работает

ладно я ссылку с длинной арифметикой почитаю, еще раз спасибо)

Ссылка на комментарий
  • 10 месяцев спустя...

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...