![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разминка для мозгов
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 ой степени!