man22 Опубликовано 3 декабря, 2011 Жалоба Поделиться Опубликовано 3 декабря, 2011 Помогите пожалуйстаЗадача такова:возвести число a в степень nНа первый взгляд задача легкая, но я столкнулся с проблемойВот мой код:program power;{$N+}var a,n:integer;S:double;beginassign(input,'power.in');reset(input);assign(output,'power.out');rewrite(output);S:=1;read(a,n);while n<>0 dobeginS:=S*a;n:=n-1;end;write(S:0:0);end.при более менее маленьких значениях a и n программа работает,но при a=5 и n=50 в файл power.out выводится число 88817841970012530000000000000000000однако верный ответ 88817841970012523233890533447265625в инете прочитал, что вещественные типы округляются в дробных частях чисел, а здесь дробной части нет, что делать? Ссылка на комментарий
nonlux Опубликовано 3 декабря, 2011 Жалоба Поделиться Опубликовано 3 декабря, 2011 Ну вообще если в твоей записи нет дроби это не значит что ее вообще нет.Здесь по видимому компилятор оперирует не8881784197001253000000000000000000088817841970012523233890533447265625а8881784197001253x10^198881784197001252,3233890533447265625x10^19как это обойти в пакале? хз.Стандартная функция для степени почему не катит?Если нужет бесконечный порядок тоS:=S*a не подойдет,ищи алкоритмы по умножению длинных чисел Ссылка на комментарий
TolkienDRR Опубликовано 3 декабря, 2011 Жалоба Поделиться Опубликовано 3 декабря, 2011 man22, прежде чем в лес ходить - уточни у преподавателя надо ли это делать? У тебя число получается больше, чем может сохранить тип double. Если делать надо - то почитай примерно тут: http://forum.pascal.net.ru/index.php?showtopic=2428 Ссылка на комментарий
nonlux Опубликовано 4 декабря, 2011 Жалоба Поделиться Опубликовано 4 декабря, 2011 У тебя число получается больше, чем может сохранить тип double.А я почитал, что как то такДлина числового типа данных, 8 байтКоличество значащих цифр числового типа данных 15..16Диапазон десятичного порядка числового типа данных -324..+308??? Где правдато есть это в районе 10^308 а он явно это не перепутал.А если бы перепутал, проявилось бы это скорее в -отрицательном значении, а не в отбрасывании чисел)) Ссылка на комментарий
TolkienDRR Опубликовано 4 декабря, 2011 Жалоба Поделиться Опубликовано 4 декабря, 2011 nonlux, одно другому не мешает. Ты можешь запомнить 16 значащих цифр (как и видно из примера топикстартера), но все остальные значащие цифры не запоминаются в числе, в то время как порядок числа запоминает больше чем 16 степень. Поэтому первые 16 цифр запоминаются, остальные запоминаются как просто 10^n. Т.о. в памяти число запоминается как 8,881784197001253*10^33. Если возвести в степень, то и получатся нули после первых 16 цифр. Предлагаю использовать тип comp. Ссылка на комментарий
nonlux Опубликовано 4 декабря, 2011 Жалоба Поделиться Опубликовано 4 декабря, 2011 ок, это немного сбило с толку Ссылка на комментарий
man22 Опубликовано 5 декабря, 2011 Автор Жалоба Поделиться Опубликовано 5 декабря, 2011 TolkienDRR,nonlux, спасибо за помощь) да я не с преподователем занимаюсь, а сам)попробовал тип comp, выдает ошибку 207:invalid floating point operationменяю тип обратно на double, все работаетладно я ссылку с длинной арифметикой почитаю, еще раз спасибо) Ссылка на комментарий
roober Опубликовано 15 октября, 2012 Жалоба Поделиться Опубликовано 15 октября, 2012 вещественный тип округляется... вещественный тип округляется... и превращается в элегантный integer!) Ссылка на комментарий
Рекомендуемые сообщения
Пожалуйста, войдите, чтобы комментировать
Вы сможете оставить комментарий после входа в
Войти