Пятница, 29 Мар 2024, 11:46
Uchi.ucoz.ru
Меню сайта
Форма входа

Категории раздела
Высшая математика [11]
Экономическая социология [95]
Основы Менеджмента [64]
Бухгалтерский учёт [157]
Философия [163]
Мировая Экономика [603]
Бизнес планирование [29]
Финансирование и кредитование инвест [105]
Ценообразование [46]
Гражданское право [196]
Права Человека [173]
Основы Маркетинга [207]
Основы энергосбережения [55]
Информатика [0]
Экология и устойчивое развитие [0]
Физика для студентов [0]
Основы права [0]
Политология [0]
Не стандартные примеры на Delphi [169]
Примеры на Delphi7 [108]
Алгоритмы [94]
API [110]
Pascal [152]
Базы Данных [6]
Новости
Чего не хватает сайту?
500
Статистика
Зарегистрировано на сайте:
Всего: 51635


Онлайн всего: 7
Гостей: 7
Пользователей: 0
Яндекс.Метрика
Рейтинг@Mail.ru

Каталог статей


Главная » Статьи » Студентам » Алгоритмы

Возведение числа в степень I
В: Это может звучать тривиально, но как мне возвести число в
степень? Например, 2^12 = 4095.
На самом деле вопрос далеко не тривиальный. Проблема в том, что сам алгоритм
функции далеко не прост. Функцией Power(X, N) (т.е. X^N) должны четко
отслеживаться несколько возможных ситуаций:

X любое число, N = 0
X = 1, N любое число
X = 0 и N > 0
X = 0 и N < 0
X > 0
X < 0 и N нечетное целое
X < 0 и N целое
X < 0 и N нецелое Посмотрите на следующую, абсолютно правильно
работающую функцию (тем не менее она может быть и не самой эффективной!):

interface

type

EPowerException =
class(Exception)end;

implementation

function
Power(X, N : real) : extended; var

t : longint;
r : real;
isInteger : boolean;begin

if N = 0 then begin
result := 1.0;
exit;
end;

if X = 1.0 then begin
result := 1.0;
exit;
end;

if X = 0.0 then begin
if N > 0.0 then
begin
result := 0.0;
exit;
end
else
raise EPowerException.Create('Результат -
бесконечность');
end;

if (X > 0) then
try
result := exp(N * ln(X));
exit;
except
raise EPowerException.Create('Результат -
переполнение или потеря значимости');
end;

{ X - отрицательный,
но мы все еще можем вычислить результат, если n целое. }
{ пытаемся получить
целую часть n с использованием типа longint, вычисление }
{ четности n не
займет много времени }

try
t := trunc(n);
if (n - t) = 0 then
isInteger := true
else
isInteger := False;
except
{ Лишний бит может вызвать переполнение или
потерю значимости }
r := int(n);
if (n - r) = 0 then
begin
isInteger := true;
if frac(r/2) = 0.5 then
t := 1
else
t := 2;
end
else
isInteger := False;
end;

if isInteger then
begin
{n целое}
if odd(t) then
{n нечетное}
try
result := -exp(N * ln(-X));
exit;
except
raise EPowerException.Create('Результат -
переполнение или потеря значимости');
end
else
{n четное}
try
result := exp(N * ln(-X));
exit;
except
raise EPowerException.Create('Результат -
переполнение или потеря значимости');
end;
end
else
raise EPowerException.Create('Результат
невычисляем');
end;
Категория: Алгоритмы | Добавил: Lerka (21 Ноя 2012)
Просмотров: 833 | Рейтинг: 1.0/ 5 Оштрафовать | Жаловаться на материал
Похожие материалы
Всего комментариев: 0

Для блога (HTML)


Для форума (BB-Code)


Прямая ссылка

Профиль
Пятница
29 Мар 2024
11:46


Вы из группы: Гости
Вы уже дней на сайте
У вас: непрочитанных сообщений
Добавить статью
Прочитать сообщения
Регистрация
Вход
Улучшенный поиск
Поиск по сайту Поиск по всему интернету
Наши партнеры
Интересное
Популярное статьи
Портфолио ученика начальной школы
УХОД ЗА ВОЛОСАМИ ОЧЕНЬ ПРОСТ — ХОЧУ Я ЭТИМ ПОДЕЛИТ...
Диктанты 2 класс
Детство Л.Н. Толстого
Библиографический обзор литературы о музыке
Авторская программа элективного курса "Практи...
Контрольная работа по теме «Углеводороды»
Поиск
Главная страница
Используются технологии uCoz