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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2012, 21:34   #1
Dellc
 
Регистрация: 24.03.2012
Сообщений: 8
По умолчанию Кубический корень. Pascal

Доброго времени суток. Дана задача в паскале:
В массиве найдите элементы, корни кубические из которых, являлись бы целыми числами, и выведите эти элементы на экран.
Собственно не понятно как определить целое ли число.
Dellc вне форума Ответить с цитированием
Старый 24.03.2012, 21:49   #2
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Код:
var
RootOf: Double;
.........
RootOf := Root3(.....);
if Abs(Round(RootOf) - RootOf) < DELTA then
  нашли!
DELTA поменьше, 0,00001 где-то... оно нужно т.к. дробные числа имеют особенности такие, что порой 5 - 4 не равно 1, а 1 +-DELTA
GreenWizard вне форума Ответить с цитированием
Старый 24.03.2012, 22:21   #3
Dellc
 
Регистрация: 24.03.2012
Сообщений: 8
По умолчанию

Спасибо, попробуем так
Dellc вне форума Ответить с цитированием
Старый 24.03.2012, 23:21   #4
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

а как насчет такой идеи?
Код:
if round(x) = x then
 // целое число...
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Старый 24.03.2012, 23:47   #5
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

VIK_aka_TOR, почитайте о вычислениях с плавающей точкой
GreenWizard вне форума Ответить с цитированием
Старый 25.03.2012, 00:22   #6
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Цитата:
Сообщение от GreenWizard Посмотреть сообщение
VIK_aka_TOR, почитайте о вычислениях с плавающей точкой
Ты процитируй, а то мне уже тоже интересно :\
По теме: согласен с VIK_aka_TOR
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 25.03.2012, 13:07   #7
Dellc
 
Регистрация: 24.03.2012
Сообщений: 8
По умолчанию

Код:
program laba_5;
var
N:array [1..10] of integer;
i:integer;
x:real;
begin
WriteLn('Vvedite massiv n');
for i:=1 to 10 do
Read(n[i]);
for i:=1 to 10 do
begin
x:=exp(ln(N[i])/3);
if round(x)=x then
Writeln('Koren is',N[i],'=',x);
end;
readln;
readln;
end.
Написал не работает...
Dellc вне форума Ответить с цитированием
Старый 25.03.2012, 14:08   #8
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Цитата:
Сообщение от whatever Посмотреть сообщение
Ты процитируй, а то мне уже тоже интересно :\
По теме: согласен с VIK_aka_TOR
статья полная: http://habrahabr.ru/post/112953/
выдержка про сравнение:
Цитата:
Очень распространенная ошибка при работе с float-ами возникает при проверке на равенство. Например,

Код:
float fValue = 0.2;
if (fValue == 0.2) DoStuff();
Ошибка здесь, во-первых, в том, что 0,2 не имеет точного двоичного представления, а во-вторых 0,2 – это константа двойной точности, а переменная fValue – одинарной, и никакой гарантии о поведении этого сравнения нет.

Лучший, но все равно ошибочный способ, это сравнивать разницу с допустимой абсолютной погрешностью:

Код:
if (fabs(fValue – fExpected) < 0.0001) DoStuff(); // fValue=fExpected?
Недостаток такого подхода в том, что погрешность представления числа увеличивается с ростом самого этого числа. Так, если программа ожидает «10000», то приведенное равенство не будет выполняться для ближайшего соседнего числа (10000,000977). Это особенно актуально, если в программе имеется преобразование из одинарной точности в двойную.
это касается Double и Extended.... проявляется рандомно, грубо говоря
Второй способ достаточно приемлемый, хоть и не абсолютно верный

Последний раз редактировалось GreenWizard; 25.03.2012 в 14:10.
GreenWizard вне форума Ответить с цитированием
Старый 25.03.2012, 18:05   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

GreenWizard, +1

позволю себе дополнить ответ.

я тут на форуме неоднократнейше предлагал ознакомиться с профильными статьями.

вот ЗДЕСЬ я размещал ссылки на статьи...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.03.2012, 18:11   #10
Dellc
 
Регистрация: 24.03.2012
Сообщений: 8
По умолчанию

Код:
{$N+}
program laba_5;
var
N:array [1..10] of integer;
i:integer;
x:double;
begin
WriteLn('Vvedite massiv n');
for i:=1 to 10 do
Read(n[i]);
for i:=1 to 10 do
begin
x:=exp(ln(N[i])/3);
if abs(round(x)-x) < DELTA then
Writeln('Koren is',N[i],'=',x);
end;
readln;
readln;
end.
пишет что не понимает что такое дельта

Последний раз редактировалось Dellc; 25.03.2012 в 18:14.
Dellc вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
корень кубический Небесный Общие вопросы Delphi 6 30.05.2010 12:50
Кубический подграф Chelmgn Помощь студентам 3 23.05.2010 21:18
кубический корень числа UnrealSP Помощь студентам 0 02.11.2009 18:04
Кубический корень от отрицательного числа Vito89 Помощь студентам 9 29.09.2009 14:40