powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как ПРАВИЛЬНО вычислять корень N-ой степени
25 сообщений из 26, страница 1 из 2
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39260192
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В Каше есть стандартная функция возведения в степень. Она равна "**".
Имеем число 3.
Возводим его в 3-ю степень (3**3). Получаем 27.
Этот же оператор используется и для извлечения корня n-ой степени
Теперь вычислим из 27 корень кубический.
27**(1/3)=2,999999999963.
Элементарно, а ответ явно кривой.

Отсюда вопрос, как правильно (какую) использовать функцию для извлечения корня n-ой степени?
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39260200
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-О,

Не уверен, что это правильно , но
Код: plaintext
1.
USER>write 27**$double(1/3)
3
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39260202
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-О,

Через логарифм получается чуть ровнее )))
Код: plaintext
1.
USER>w $zexp(1/3*$zln(27))
2.999999999999999998
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39260204
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр Коблов,

И да и нет.
Всё что менее 10 - работает. Всё что более 100 - та же проблема.
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39260210
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну я,

Да, ровнее.

Но интересует возможность использовать ПРАВИЛЬНУЮ функцию, а не заменители.
У меня стойкая уверенность, что расчёт логарифма будет явно идти дольше при большом количестве вычислений.
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39260221
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
 w "21548787546456346",!
 w "",!
 
 Set TStart=$PIECE($NOW(),",",4)
 Set www=21548787546456346
 For i=1:1:5
 {
  s www=$zexp(1/3*$zln(www))
 }
 w www,!
 
 Set TEnd=$PIECE($NOW(),",",4)
 Set TVsego=(TEnd-TStart)
 w "  zln= Затраченное время ",($FNumber(TVsego,"",4))," сек",!
 
 
 
 
 Kill
 
 Set TStart=$PIECE($NOW(),",",4)
 
 Set www=21548787546456346
 For i=1:1:7
 {
  s www=www**$double(1/i)
 }
 w www,!
 
 Set TEnd=$PIECE($NOW(),",",4)
 Set TVsego=(TEnd-TStart)
 w "  double= Затраченное время ",($FNumber(TVsego,"",4))," сек",!  
А на скриншоте приведены результаты.
Вопрос. Какой из них верный?
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39260222
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отличия не маленькие.

1,167 и 1,007
Это 16% в конечном результате.
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39260229
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Калькулятор Windows выдаёт вообще 1,36

Я ему доверяю больше.
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39260233
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пардон, закралась ошибка во вторую часть кода.
Вместо 5-ти циклов указал 7.

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


Отсюда вывод: s www=www**$double(1/i) даёт гораздо более точные результаты
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39260244
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-О,

А в первом цикле вы 1/3*$zln(www) на 1/i*$zln(www) заменили?
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39260257
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр КобловО-О-О,

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

Сейчас проверю.
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39260266
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо. Вопрос снят.
Самый точный результат получается через Логарифм.
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39260272
EvLaUy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неплохая задача, чтобы занять время бета-тестеров Intersystems. А в практическом плане... Хотел бы я видеть заказчика ПО на Cache, для реализации ТЗ которого нужно с большой точностью извлекать корни. Я написал тонны кода на Cache для очень разных заказчиков, но с такой экзотикой не встретился ни разу.
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39260284
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-ОВсем спасибо. Вопрос снят.Ещё не снят: вместо $PIECE($NOW(),",",4) нужно $PIECE($NOW(),",",2), а ещё лучше использовать $zh, которая рекомендуется самим производителем для бенчмарков:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 w "21548787546456346",!!
 
 s time=$zh, www=21548787546456346  f i=1:1:5 s www=$zexp(1/i*$zln(www))
 w www,!,"  zln = Затраченное время ",$zh-time," сек",!
 
 k
 
 s time=$zh, www=21548787546456346  f i=1:1:5  s www=www**$double(1/i)
 w www,!,"  double = Затраченное время ",$zh-time," сек",!  
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39260335
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvLaUyНеплохая задача, чтобы занять время бета-тестеров Intersystems. А в практическом плане... Хотел бы я видеть заказчика ПО на Cache, для реализации ТЗ которого нужно с большой точностью извлекать корни. Я написал тонны кода на Cache для очень разных заказчиков, но с такой экзотикой не встретился ни разу.

Было дело, ПО для стендов испытания авиационных двигателей. Там формулы были "трехэтажные", а особенно когда поиск корней итерационным методом... Да еще в темпе поступления измеряемых данных, каждые 20 мс полные перерасчеты... Газодинамика...
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39261446
Шваров Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересная тема, спасибо!
Начал обсуждение на DC.
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39261648
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit...а ещё лучше использовать $zh, которая рекомендуется самим производителем для бенчмарков.В целом согласен, сам стараюсь использовать $zhorolog всюду, где можно. К сожалению, этой полезной svn нет в GT.M и видимо не будет, т.к. её место уже занято.

Однако по приведённой ссылке открылась не рекомендация, а лишь пример использования $zhorolog. Более того, у ISC, насколько знаю, отсутствует документ на тему, как правильно мерить время исполнения кода, а если и есть, то они сами его не читали (судя по некоторым постам на Community).
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39261667
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslov,
Насколько я помню, раньше разрешение $zhorolog было выше, а сейчас только 6 знаков после запятой, чего не всегда хватает. Теперь две рядом исполняемых команды выдадут одно и то же значение $zhorolog.
Код: plaintext
f i=1:1:1000 s a=$zh,b=$zh w !,"i=",i," b-a=",b-a
Раньше было круче! Зачем урезали..?
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39261742
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 seconds Microseconds on Windows , see below.
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39261746
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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. Возможно, просто компы стали быстрее :)
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39261756
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39261774
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslov,
Да, боюсь, что такие прелести были еще под Win 2000, или даже Win NT. Хотя и от материнки тоже сильно может зависеть.
Во всяком случае hang 0.01 на некоторых материнках держала 10 мсек, а на некоторых только 15 мсек.
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39261839
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexKB,

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

Строчка понравилась, посмотрел такой вариант.
...
Рейтинг: 0 / 0
Как ПРАВИЛЬНО вычислять корень N-ой степени
    #39266854
rstr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rstr, Чему немало удивился.USER>f i=1:1:1000 s a=$zh,b=$zh i b-a>.000002 w !,"i=",i," b-a=",b-a

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как ПРАВИЛЬНО вычислять корень N-ой степени
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]