687 / 444 / 209
Регистрация: 18.10.2020
Сообщений: 1,606
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Возведение вещественного числа в вещественную степень16.09.2022, 23:41. Показов 1258. Ответов 8
Решил написать функцию pow, может кому понадобится
funcs.h Кликните здесь для просмотра всего текста
funcs.cpp Кликните здесь для просмотра всего текста
main.cpp Кликните здесь для просмотра всего текста
Добавлено через 11 минут
0
|
16.09.2022, 23:41 | |
Ответы с готовыми решениями:
8
Возведение отрицательного числа в вещественную степень Рекурсивные функции: возведение вещественного числа в целую степень Возведение в вещественную степень Программа возведения комплексного числа в вещественную степень !!! Возведение числа а в степень n |
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
|
|
16.09.2022, 23:50 | 2 |
0
|
687 / 444 / 209
Регистрация: 18.10.2020
Сообщений: 1,606
|
|
16.09.2022, 23:59 [ТС] | 3 |
ага, а вообще подтолкнула одна тема, где человечек собирался написать свою мат библу.
0
|
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
|
||||||
17.09.2022, 01:31 | 4 | |||||
Было бы интересно дать оценку точности тех функций, где присутствует циклическое накопление ошибок округления.
Не зная точности, это "кустарное, неизвестного качества". А вот если бы функция powerd давала верхнюю/нижнюю оценку, она стала бы более полезной чем встроенная, которая "стараюсь как можно точнее, погрешность сам вычисляй на доверии что мантисса верна" Добавлено через 45 минут Я сравнил с фабричным pow(), для 0.8^20 получил нормализованную ошибку 1е-15 - это самая большая из наспех найденных. Большинство ошибок были вверх, но для 0.7^N ошибки были вниз. В абсолютных значениях, первое число это pow(), второе - разница с powerd(): 0.7^20 = 0.000797922662976118944773429309 / -0.000000000000000000108420217249 0.8^20 = 0.011529215046068483005448079837 / 0.000000000000000012143064331838 Что такое нормализованная ошибка 1е-15? 64-битное представление double содержит 53 бит мантиссы, или 16 десятичных цифр, 1е-15 изменит последнюю цифру. Поменяв внутренние вычисления в powerd() на long double, я получил точное совпадение с встроенной, за исключением: 0.3^31 - 2e-16 0.6^31 - 2e-16 0.9^51 - 2e-16 Кликните здесь для просмотра всего текста
Добавлено через 11 минут С логарифмом проблема - вызов ln(1000 000 000) от миллиарда занимает 20 секунд, и ошибается на 0.0007. Для плавающей точки скорость вычисления логарифма не должна зависеть от величины числа, т.к. мантисса уже нормализована, нужно потом только приплюсовать к результату степень умноженную на ln(2).
1
|
687 / 444 / 209
Регистрация: 18.10.2020
Сообщений: 1,606
|
|
17.09.2022, 15:13 [ТС] | 7 |
IGPIGP, знаем, но с трудом представляю, что кому-то нужно будет возводить в степень, буольшую 2*10^6 хотя бы) плюс в таком случае всегда можно обойтись циклами.
я их не понимаю, поэтому для себя написал ещё и функцию без их использования. Дойдут руки изучу и их (функцию с ними нашёл на просторах интернета) этого вот не понял, ну по формуле как раз подсчёт ещё как зависит от числа, но вот как избавиться от этой зависимости - не знаю.
0
|
Комп_Оратор)
|
|
17.09.2022, 15:44 | 8 |
Вопросов больше нет. Для системы без сопроцессора и кобыла - невеста. (Дворник - Остапу Сулейману де Берта Мария Бендеру-бею. Не есквайеру. 12 стульев).
0
|
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
|
|
17.09.2022, 16:58 | 9 |
programmer_08,
Мантисса в double нормализована, всегда 1 <= m < 2. Ее легко извлечь одной операцией Для такого числа ваш код даст предсказуемую высокую скорость и точность. Затем к результату добавить поправку от двоичной экспоненты, которую убирали. Ln(m*2x) = ln(m) + x*ln(2)
1
|
17.09.2022, 16:58 | |
17.09.2022, 16:58 | |
Помогаю со студенческими работами здесь
9
Возведение числа в степень n Возведение числа в степень! Возведение числа в степень n-1 Возведение числа n в степень m. Возведение числа в степень Возведение из числа степень Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |