Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 343
В Каше есть стандартная функция возведения в степень. Она равна "**".
Имеем число 3.
Возводим его в 3-ю степень (3**3). Получаем 27.
Этот же оператор используется и для извлечения корня n-ой степени
Теперь вычислим из 27 корень кубический.
27**(1/3)=2,999999999963.
Элементарно, а ответ явно кривой.

Отсюда вопрос, как правильно (какую) использовать функцию для извлечения корня n-ой степени?

К сообщению приложен файл. Размер - 44Kb
22 июн 16, 11:09    [19321930]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
Александр Коблов
Member

Откуда: Краснодар, Москва
Сообщений: 241
О-О-О,

Не уверен, что это правильно, но
USER>write 27**$double(1/3)
3


Сообщение было отредактировано: 22 июн 16, 12:08
22 июн 16, 11:23    [19321992]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
ну я
Member

Откуда: Москва
Сообщений: 1258
О-О-О,

Через логарифм получается чуть ровнее )))
USER>w $zexp(1/3*$zln(27))
2.999999999999999998


Сообщение было отредактировано: 22 июн 16, 12:09
22 июн 16, 11:27    [19322020]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 343
Александр Коблов,

И да и нет.
Всё что менее 10 - работает. Всё что более 100 - та же проблема.

К сообщению приложен файл. Размер - 51Kb
22 июн 16, 11:28    [19322029]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 343
ну я,

Да, ровнее.

Но интересует возможность использовать ПРАВИЛЬНУЮ функцию, а не заменители.
У меня стойкая уверенность, что расчёт логарифма будет явно идти дольше при большом количестве вычислений.

К сообщению приложен файл. Размер - 48Kb
22 июн 16, 11:33    [19322070]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 343
Вот код:
 "21548787546456346",!
 
"",!
 
 
Set TStart=$PIECE($NOW(),",",4)
 
Set www=21548787546456346
 
For i=1:1:5
 
{
  
www=$zexp(1/3*$zln(www))
 
}
 
www,!
 
 
Set TEnd=$PIECE($NOW(),",",4)
 
Set TVsego=(TEnd-TStart)
 
"  zln= Затраченное время ",($FNumber(TVsego,"",4))," сек",!
 
 
 
 
 
Kill
 
 Set 
TStart=$PIECE($NOW(),",",4)
 
 
Set www=21548787546456346
 
For i=1:1:7
 
{
  
www=www**$double(1/i)
 
}
 
www,!
 
 
Set TEnd=$PIECE($NOW(),",",4)
 
Set TVsego=(TEnd-TStart)
 
"  double= Затраченное время ",($FNumber(TVsego,"",4))," сек",!  
А на скриншоте приведены результаты.
Вопрос. Какой из них верный?

К сообщению приложен файл. Размер - 46Kb


Сообщение было отредактировано: 22 июн 16, 11:56
22 июн 16, 11:43    [19322147]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 343
Отличия не маленькие.

1,167 и 1,007
Это 16% в конечном результате.
22 июн 16, 11:44    [19322156]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 343
Калькулятор Windows выдаёт вообще 1,36

Я ему доверяю больше.

К сообщению приложен файл. Размер - 43Kb
22 июн 16, 11:48    [19322193]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 343
Пардон, закралась ошибка во вторую часть кода.
Вместо 5-ти циклов указал 7.

С исправленным кодом получил сдедующие результаты.


Отсюда вывод: www=www**$double(1/i) даёт гораздо более точные результаты

К сообщению приложен файл. Размер - 103Kb


Сообщение было отредактировано: 22 июн 16, 12:10
22 июн 16, 11:52    [19322227]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
Александр Коблов
Member

Откуда: Краснодар, Москва
Сообщений: 241
О-О-О,

А в первом цикле вы 1/3*$zln(www) на 1/i*$zln(www) заменили?

Сообщение было отредактировано: 22 июн 16, 12:11
22 июн 16, 12:00    [19322265]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 343
Александр Коблов
О-О-О,

А в первом цикле вы 1/3*$zln(www) на 1/i*$zln(www) заменили?
Каюсь, нет.

Сейчас проверю.

Сообщение было отредактировано: 22 июн 16, 12:14
22 июн 16, 12:09    [19322327]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 343
Всем спасибо. Вопрос снят.
Самый точный результат получается через Логарифм.

К сообщению приложен файл. Размер - 125Kb
22 июн 16, 12:15    [19322358]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
EvLaUy
Member

Откуда: Москва
Сообщений: 2350
Неплохая задача, чтобы занять время бета-тестеров Intersystems. А в практическом плане... Хотел бы я видеть заказчика ПО на Cache, для реализации ТЗ которого нужно с большой точностью извлекать корни. Я написал тонны кода на Cache для очень разных заказчиков, но с такой экзотикой не встретился ни разу.
22 июн 16, 12:19    [19322373]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3141
Блог
О-О-О
Всем спасибо. Вопрос снят.
Ещё не снят: вместо $PIECE($NOW(),",",4) нужно $PIECE($NOW(),",",2), а ещё лучше использовать $zh, которая рекомендуется самим производителем для бенчмарков:
 "21548787546456346",!!
 
 
time=$zhwww=21548787546456346  i=1:1:5 www=$zexp(1/i*$zln(www))
 
www,!,"  zln = Затраченное время ",$zh-time," сек",!
 
 
k
 
 s 
time=$zhwww=21548787546456346  i=1:1:5  www=www**$double(1/i)
 
www,!,"  double = Затраченное время ",$zh-time," сек",!  


Сообщение было отредактировано: 22 июн 16, 12:43
22 июн 16, 12:36    [19322431]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
AlexKB
Member

Откуда: Запорожье
Сообщений: 855
EvLaUy
Неплохая задача, чтобы занять время бета-тестеров Intersystems. А в практическом плане... Хотел бы я видеть заказчика ПО на Cache, для реализации ТЗ которого нужно с большой точностью извлекать корни. Я написал тонны кода на Cache для очень разных заказчиков, но с такой экзотикой не встретился ни разу.


Было дело, ПО для стендов испытания авиационных двигателей. Там формулы были "трехэтажные", а особенно когда поиск корней итерационным методом... Да еще в темпе поступления измеряемых данных, каждые 20 мс полные перерасчеты... Газодинамика...
22 июн 16, 13:21    [19322693]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
Шваров Евгений
Member

Откуда:
Сообщений: 872
Интересная тема, спасибо!
Начал обсуждение на DC.
24 июн 16, 02:02    [19328848]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1641
servit
...а ещё лучше использовать $zh, которая рекомендуется самим производителем для бенчмарков.
В целом согласен, сам стараюсь использовать $zhorolog всюду, где можно. К сожалению, этой полезной svn нет в GT.M и видимо не будет, т.к. её место уже занято.

Однако по приведённой ссылке открылась не рекомендация, а лишь пример использования $zhorolog. Более того, у ISC, насколько знаю, отсутствует документ на тему, как правильно мерить время исполнения кода, а если и есть, то они сами его не читали (судя по некоторым постам на Community).
24 июн 16, 11:34    [19330423]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
AlexKB
Member

Откуда: Запорожье
Сообщений: 855
Alexey Maslov,
Насколько я помню, раньше разрешение $zhorolog было выше, а сейчас только 6 знаков после запятой, чего не всегда хватает. Теперь две рядом исполняемых команды выдадут одно и то же значение $zhorolog.
i=1:1:1000 a=$zh,b=$zh w !,"i=",i," b-a=",b-a
Раньше было круче! Зачем урезали..?

Сообщение было отредактировано: 24 июн 16, 12:49
24 июн 16, 11:56    [19330624]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3141
Блог
AlexKB
Насколько я помню, раньше разрешение $zhorolog было выше, а сейчас только 6 знаков после запятой, чего не всегда хватает.

Раньше было круче! Зачем урезали..?
Документация
The second number (sssss.ffffff) is the number of seconds (and fractional seconds) since midnight of the current day. Caché increments the sssss field from 0 to 86399 seconds. When it reaches 86399 at midnight, Caché resets the sssss field to 0 and increments the date field by 1. The number of ffffff fractional digits is the maximum precision supported by the current operating system. For more on Windows fractional secondsMicroseconds on Windows, see below.
24 июн 16, 13:00    [19331133]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1641
AlexKB,

не припомню такого; тебе проще проверить, т.к. имеешь старые версии под рукой.
Однако документация утверждает, что
Date and Time Functions Compared
$NOW returns the local date and time for the current process. $NOW returns the date and time in Cache storage format. It includes fractional seconds; the number of fractional digits is the maximum precision supported by the current operating system.
Про $zh подобного объяснения нет, но можно предположить, что использовался аналогичный подход.
У меня и под Windows, и под Linux $zh содержит 6 цифр после десятичной точки. Больше, наверное, взять неоткуда.

AlexKB
Теперь две рядом исполняемых команды выдадут одно и то же значение $zhorolog.
Возможно, просто компы стали быстрее :)
24 июн 16, 13:03    [19331154]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1641
servit,
Документация
The second number (sssss.ffffff) is the number of seconds (and fractional seconds) since midnight of the current day...
Мы с вами практически одновременно процитировали описание другой функции - $Now(). Про $zh известно лишь:
Документация
$ZHOROLOG contains the number of seconds that have elapsed since the most recent Caché startup. This is a count, which is independent of clock changes and day boundaries. The value is expressed as a floating point number, indicating seconds and fractions of a second. The number of decimal digits is platform-dependent.


Сообщение было отредактировано: 24 июн 16, 14:56
24 июн 16, 13:12    [19331219]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
AlexKB
Member

Откуда: Запорожье
Сообщений: 855
Alexey Maslov,
Да, боюсь, что такие прелести были еще под Win 2000, или даже Win NT. Хотя и от материнки тоже сильно может зависеть.
Во всяком случае hang 0.01 на некоторых материнках держала 10 мсек, а на некоторых только 15 мсек.

Сообщение было отредактировано: 24 июн 16, 14:55
24 июн 16, 13:35    [19331365]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1641
AlexKB,

немного изменив твой пример (две $zh подряд - всё же, ИМХО, через край):
(c,d)=0,a=$zh,top=100000 i=1:1:top b=$zh s:b-a c=c+1,d=d+b-a=i=top !,"расхождения $zh: кол-во=",c," сумма=",d," среднее=",d/top
Результаты на разных компах (2 последних - на Linux-серверах):
расхождения $zh: кол-во=47755 сумма=.047799 среднее=.00000047799
расхождения $zh: кол-во=40493 сумма=.041625 среднее=.00000041625
расхождения $zh: кол-во=24657 сумма=.024865 среднее=.00000024865
Многократные повторы командной строки показали, что стабильна только 7-я цифра после точки в среднем расхождении $zh. И ясно, что на результат влияют внешние факторы: платформа виртуализации, точность часов в ОС, загруженность сервера и т.д. Также ясно, что при исполнении столь коротких участков кода влияние внешних факторов выше, чем внутренних (модель CPU, версия Cache), иначе сложно объяснить такую "волатильность" результата.

Сообщение было отредактировано: 24 июн 16, 14:54
24 июн 16, 14:39    [19331765]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
rstr
Member

Откуда: Хабаровск
Сообщений: 36
AlexKB,

Строчка понравилась, посмотрел такой вариант.
2 июл 16, 16:54    [19362983]     Ответить | Цитировать Сообщить модератору
 Re: Как ПРАВИЛЬНО вычислять корень N-ой степени  [new]
rstr
Member

Откуда: Хабаровск
Сообщений: 36
rstr, Чему немало удивился.
USER>i=1:1:1000 a=$zh,b=$zh i b-a>.000002 !,"i=",i," b-a=",b-a

i=1 b-a=.000003
i=193 b-a=.000008
i=209 b-a=.000163
i=302 b-a=.000003
i=315 b-a=.000003
i=399 b-a=.000007
i=442 b-a=.000009
i=582 b-a=.000003
i=592 b-a=.000003
i=663 b-a=.000012
i=698 b-a=.000007
i=829 b-a=.000003
i=849 b-a=.000003
i=943 b-a=.000009


Сообщение было отредактировано: 2 июл 16, 20:08
2 июл 16, 16:56    [19362988]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить