Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Разминка для мозгов


Страницы:   1 2

Ricks ©   (2007-07-07 18:30:00) 

Как в Delphi 7 (но не выше) сделать такую штуку:

дана точность

const
prec = -2;


то есть считаем что это степень десятки 10^(-2)

как не используя динамические массивы объявить массив:


var
a : array [0..?] of ...


содержащий столько элементов, сколько при заданной точности будет содержать отрезок [0..1]. В нашем случае 100


Ricks   (2007-07-08 18:11:00) [1]


> Юрий Зотов

Да я уже давно разобрался и использую динамические массивы (см програму выше)

А тема называется "Разминка для мозгов"... :)


Юрий Зотов   (2007-07-08 16:05:00) [2]

> Ricks ©   (08.07.07 14:50) [34]

Если кол-во точек Вы хотите вычислять на этапе компиляции, то никто не мешает сделать это руками и прописать константу. А если на этапе выполнения, то без динамического массива не обойтись.

PS
Зачем хотеть странного?


Ricks   (2007-07-08 14:50:00) [3]


> какой случай может потребовать их запрет


АВТОРСКИЙ! :)


Vlad Oshin   (2007-07-08 14:06:00) [4]


>  [32]

да почему?
какой случай может потребовать их запрет, просто теоретически..


Dib@zol   (2007-07-08 13:42:00) [5]


> Dib@zol ©   (07.07.07 22:50) [22]

Вот чем.


Vlad Oshin   (2007-07-08 13:41:00) [6]


> var
> a : array [0..?] of ...

a : array of ...
setlength в зависимости от константы и т.д.
имхо так.
советовали же уже, чем не нравится..


Dib@zol   (2007-07-08 13:08:00) [7]


> Так вопрос стоял о том что нам задана (или мы задаем) точнось,
>  а оно само должно высчитывать.

Понимаешь, динамически ты точность так или иначе не задашь. То есть только при компиляции. Используй тогда макрокоманды чтоль, чтоб само тебе вычислялось.


Ricks   (2007-07-08 12:46:00) [8]


> А почему не пойти обратным путем


Обратный путь не подходит. Нужно по заданной точность определить кол-во точек, а не наоборот.

Вот програмка, для которой мне это было нужно (програма про случайные числа).
http://www.ricks.pisem.net/sl.zip


Юрий Зотов   (2007-07-08 12:20:00) [9]

> Ricks ©   (08.07.07 11:28) [27]

А почему не пойти обратным путем - задаем размер и объявляем массив, а точность высчитывается?

uses Math;

const
 m = 100;

var
 a: array [0..m] of ...;
 prec: integer;

begin
 prec := -Trunc(Log10(m));
 ...


Ricks   (2007-07-08 11:28:00) [10]


> Епт а ведь если это константа то неужели нельзя воспользоваться
> КАЛькулятором и пошшитать заранее самостоятельно???


Так вопрос стоял о том что нам задана (или мы задаем) точнось, а оно само должно высчитывать.


Dib@zol   (2007-07-08 11:15:00) [11]

Епт а ведь если это константа то неужели нельзя воспользоваться КАЛькулятором и пошшитать заранее самостоятельно???


Ricks   (2007-07-08 10:45:00) [12]


> Только это вряд ли сработает. IntPower не является функцией
> компилятора.


Да. Так не работает. Иначе вопроса не было бы :)


Юрий Зотов   (2007-07-07 23:41:00) [13]

> Vendict ©   (07.07.07 22:59) [23]

m = IntPower(10, -prec) + 1; // Именно +1, в сабже ошибка.

Только это вряд ли сработает. IntPower не является функцией компилятора.


Vendict   (2007-07-07 22:59:00) [14]

пропустил ...
только вот вопрос, если она константа на этапе компиляции, что мешает сделать так:


Uses Math;
const
prec=-2;
m=Trunc(1/Power(10,prec));
var
a:array [1..m] of Integer


только я не проверял в Дельфи, запускать лень.


Dib@zol   (2007-07-07 22:50:00) [15]


> Vendict ©   (07.07.07 22:48) [21]

Глянь [0].

не используя динамические массивы


Vendict   (2007-07-07 22:48:00) [16]

неужели все стебаются ?

ответ уже дали в [6]

var
a:array of Integer;
Begin
....
setLength(a,<нужная длина>);


Ricks   (2007-07-07 19:14:00) [17]


> Тогда уж сделать precalc массив-отображение prec => 10^(-
> prec).


Вот это действительно хорошее предложение!!


ferr   (2007-07-07 19:09:00) [18]

Тогда уж сделать precalc массив-отображение prec => 10^(-prec).


Ricks   (2007-07-07 19:06:00) [19]


> а в восьмерке уже запретили ???


Не, я писал что "не выше D7" потому что не знал какие там есть новые возможности...
может там можно
array [0..round(1/power(10, prec))] of ...
или хотя бы
array [0..round(1/exp(prec * ln(10)))] of ...


Ricks   (2007-07-07 19:04:00) [20]

Короче я решение нашел, только остается найти идиота, который этим решением будет пользоваться :)
Сразу скажу, что решение находил не в delphi, a в Mathcad'e! :)

Объясняю:
10^x = exp(x * ln(10))
теперь раскладываем экспоненту в ряд
и пишем константу

const
ln10 = 2.3025850929940456840179914546844
val1 = prec * ln10;
value = 1 + val1 + val1*val1/2 + val1*val1/6 + ...

и так до 170-ой степени в маткаде :)
работает до -7 ой степени!


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо