powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Толстые натуральные логарифмы
25 сообщений из 83, страница 1 из 4
Толстые натуральные логарифмы
    #39864468
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Из курса численных методов и архитектуры FPU, я помню что железо имеет встроенный расчет
натурального логарифма.

1) Кто знает какой метод реализован под капотом? Сходу я замечу что "лобовые" методы такие как ряды Тейлора-Лорана
я обдумывал. Но возможно они не подойдут из-за наличия высоких степеней в которые нужно возводить x (см. дальше почему)

Нужна хитрость. Возможно методы основанные на последовательных приближениях.

Вот про эту хитрость я и спрашиваю.

2) В топиках простых чисел я неоднократно сталкивался с расчетом натруального логарифма для числе разрядностью
в 512 и более бит. И возникла необходимость считать с точностью выше чем double(64bit) т.к. в противном случае
мы теряем младшие разряды.


Тоесть если я к примеру беру натруальный логарим от рандомного числа с разрядностью 512 бит то я и ожидаю
что следующая проверка будет близка к точности длинных целых чисел. Например:

Код: sql
1.
exp(ln(x)) = x
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39864482
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Хитрость тут, по-моему лежит на поверхности.

Нужно привести к виду
,
где A-"удобное" число, из которого извлекается целый логарифм, B<1. Второе слагаемое считаем в лоб, сходится будет очень быстро.
С натуральным вычислить A неудобно, проще перевести в двоичный, и тогда это ближайшая степень двойки.
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39864499
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можем-ли мы применить Метод Ньютона? В этом случае мы переворачиваем график относительно диагонали
и ищем решение пересечения экспоненты с осью OX.
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39864503
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борисmayton,
Хитрость тут, по-моему лежит на поверхности.

Нужно привести к виду
,
где A-"удобное" число, из которого извлекается целый логарифм, B<1. Второе слагаемое считаем в лоб, сходится будет очень быстро.
С натуральным вычислить A неудобно, проще перевести в двоичный, и тогда это ближайшая степень двойки.
Какое удобное число А вы предложите?
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39864542
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton1) Кто знает какой метод реализован под капотом?

Есть же стандарт IEEE-754 для таких вопросов, там емнип должно быть описано какой метод в итоге реализован.

В целом я бы сказал что там табличные функции (основная таблица плюс приближения).

Есть софт-реализации (типа теста softfloat), которые сходятся со стандартом до бита.

Но это все в рамках ieee-754 разрядностей. Все что больше - на усмотрение разработчиков железа, насколько я думаю.
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39864560
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКакое удобное число А вы предложите? Я бы сначала перевел в двоичный, нашел ближайшую степень двойки, вычислил первое слагаемое, потом перевел обратно в натуральный и досчитал второе.
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39864589
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklinmayton1) Кто знает какой метод реализован под капотом?

Есть же стандарт IEEE-754 для таких вопросов, там емнип должно быть описано какой метод в итоге реализован.
Пока не нашел. Стандарт описывает только формат представления числа.
То что я спрашиваю - скорее всего архитектура со-процессора или численные методы мат-библиотек.

Но если вы знаете линк - прошу скинуть.
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39864592
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton Кто знает какой метод реализован под капотом?
https://math.stackexchange.com/questions/61209/what-algorithm-is-used-by-computers-to-calculate-logarithms
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39864793
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скачал один док The Computation of Transcendental Functions on the IA-64 Architecture. Почитаю.
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39864848
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так ли нужны сами логарифмы?
2 контрольных вопроса:
а) правильно понял, что нужно выражение b/ln(b) - a/ln(a) ?
б) разумна ли оценка этого выражения в 275 ? при а= 2^500, b= a+ 2*10^5 ?
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39864852
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин , на ln(2) надо было не умножать, а делить
Поправка в вопросе п.(б) :
оценка 577 + o((1/ln(a))^2) для b= 2^500 + 2*10^5

для b= 2^200 + 10^6 оценка разности = 7213,4752....

Годится?
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39864855
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, ИМХО в железе нет супералгоритмов, подозреваю что там решено по принципу "лишь бы было", это не та задача куда надо кучу бабла вложить
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39864863
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
реакции 0,
а я ваш последний диапазон нашёл. Оценка разности
для b= 2^1024 + 200 000 равна 281,50147

Вообще, это нижние оценки и их можно улучшать.
Но я ещё погрешность не ту сказал, она для производной, её надо умножать на те самые маленькие диапазончики 200 000 и 10^6.
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39864933
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tmayton, ИМХО в железе нет супералгоритмов, подозреваю что там решено по принципу "лишь бы было", это не та задача куда надо кучу бабла вложить
Ты ошибаешься. Это очень дорогая задача.

В свое время Intel бесплатно менял процессоры на новые тем клиентам которые пострадали от ошибки в FPU. Даже при том что эту ошибку долго не замечали в расчетах.
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39864935
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98,

Дорогой друг. Была пятница. Я хоть и активный мамбер но тоже могу завтыкать. Надеюсь мне простят эту слабость.
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39865053
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98Так ли нужны сами логарифмы?
2 контрольных вопроса:
а) правильно понял, что нужно выражение b/ln(b) - a/ln(a) ?
Да. Логарифм это не главное. Главное - получить численную оценку.
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39865091
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стоп. Пока я не кинулся очертя голову считать толстые логарифмы.

Я не исчерпал возможности double. По экспоненциальной сетке он доходит лишь до 1.7*10^308.
Мы ищем Хи-криптографическое (о котором я писал в другом тематическом топике) до 2^2048.
Для сравнения прологарифмирую оба числа.

Код: sql
1.
2.
3.
4.
5.
2^2048 => 
  2048 * Ln(2) = 1419.565425786768

1.7976931348623157 * 10^308 => 
  Ln(1.7976931348623157 * 10^308) = Ln(1.7976931348623157) + 308 * Ln(10) = 709.782712893384



Хи-крипотграфическое - больше.

Помимо стандартного double имеет под-виды.
- long double (extended) 80bit
- binary128 (Quadruple precision) 128 bit
- binary256 (Octuple precision) 256 bit

extended теоретически поддерживается GCC/Clang компилляторами поэтому играя настройками
и типами данных я думаю что этот злосчастный логарифм я смогу посчитать приближенно
без дополнительных делений.
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39865110
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
80bit декларировалось даже в старом ВС (я не проверял). Не помню, есть ли 128bit в 11g оракла. Но дело не в этом.
Пока ты в самом деле не кинулся их считать: В каких случаях это не нужно.
Это не нужно если диапазон вподне сносный для обычного подсчёта. 50 млн вполне себе.

Просто скажу, что усов-то уже сделал до меня оценку, а я зря трудился. Что там где-то расхождения в 1-50-10тыс - это ерунда. Важнее подсчитать точность оценочной формулы и контролировать именно этот +-.
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39865119
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оценки разности ,данные в таблице Усовым вполне можно использовать.
Поясню школьными рассуждениями. Скорее всего мы оба считали примерно одно.
Имеем ф-цию F=X/LnX в точках a,b, где dx= b-a (50млн, 1млн, 200тыс ...)
Т.е. доля dx/a пренебрежительно мала.

Производная F'= (Ln X - 1)/Ln^2 X
График F ассимптотически приближается к Х снизу, зачит F ещё и выпукла вверх.
Значит линейное приближение
dy= F(b)-F(a)= F'(a) dx + О(dx ^2)
будет верхней оценкой искомой разности (у меня была описка, что нижней оц.)
Кто забыл F'(a) = тангенсу наклона прямой.
Вот F'(a) dx я и подсчитал (правда на калькуляторе, поэтому и саму F'(a) без второго слагаемого, но даже это даёт ничтожное различие).

Согласно Тейлору коэфф-т при степени будет F''(a).
F''(x)= 1/X/Ln^2 X *(2/Ln X - 1)

Так что остаточный член в разложении = F''(a)/2 * dx ^2
dx ^2 / X пренебрежимо мал для ваших X= 2^200 и т.д. по сравнению с первой степенью разложения. Так что, пока это выполняется, тут всё хорошо. Надо смотреть точностные границы самой формулы для интереса.
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39865129
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На long double. Эффективно мне удасться посчитать только на числах менее 64бит по мантиссе. Если подставлять
более длинные числа то мантисса режет младшие разряды и сложение с 50 000 000 может быть грубее и грубее
соотв. с ростом выхода за пределы мантиссы.

Wiki пишет разную информацию по разрядности. Она может плавать. Visual C++ может вообще long double
проигнорировать и считать его синонимом double.

Мой GCC gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1) показывает 16 байт == 128 бит. Это неожиданно.
Я предполагал что будет 80. Это странно надо поразбираться.
На других компиллерах возможно будет другой эффект.

В таком случае __float128 должен быть бинарно совместим с long double однако мне пока его не удается распечатать
на экране с корректным форматированием.
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39865131
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
long double primesIntervalLongDouble(long double a, long double b) {
    return b / log(b) - a / log(a);
}

double primesIntervalDouble(double a, double b) {
    return b / log(b) - a / log(a);
}

__float128 primeIntFloat128(__float128 a, __float128 b) {
    return 0.0; //b / log(b) - a / log(a);
}


int main(int argc, char* argv[], char* env[]) {

	__float128 f128=0.0;

	long double a = pow(2.0, 64.0);
	long double b = pow(2.0, 64.0) + 50000000.0;
	long double c = primesIntervalLongDouble(a,b);

	printf("\n");

	printf("a   = %Lf,    sizeof(a) = %li\n", a, sizeof(a));
	printf("b   = %Lf,    sizeof(b) = %li\n", b, sizeof(b));
	printf("res = %Lf\n", c);



	double aa = 1500000000.0;
	double bb = 1550000000.0;
	double cc = primesIntervalLongDouble(aa,bb);

	printf("\n");

	printf("a = %f,    sizeof(a) = %li\n", aa, sizeof(aa));
	printf("b = %f,    sizeof(b) = %li\n", bb, sizeof(bb));
	printf("res = %f\n", cc);



	return 0;
}



Код: sql
1.
2.
3.
4.
5.
6.
7.
a   = 18446744073709551616.000000,    sizeof(a) = 16
b   = 18446744073759551488.000000,    sizeof(b) = 16
res = 1101695.343750

a = 1500000000.000000,    sizeof(a) = 8
b = 1550000000.000000,    sizeof(b) = 8
res = 2252774.751388
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39865132
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот этот дефект. После возведения 2 в 128 степень результат уже не отличается от сложения с 50 лимонами.

Код: sql
1.
2.
3.
a   = 340282366920938463463374607431768211456.000000,    sizeof(a) = 16
b   = 340282366920938463463374607431768211456.000000,    sizeof(b) = 16
res = 0.000000
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39865133
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
size(16) - скорее всего фейк. Там по идее должно быть 80 бит или 10 байт. А 16 это возможно результат
такого себе padding.
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39865134
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для __float128 функция логарифма скорее всего не определена в стандартных либах. Надо искать нестандартные.
...
Рейтинг: 0 / 0
Толстые натуральные логарифмы
    #39865161
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
25 сообщений из 83, страница 1 из 4
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Толстые натуральные логарифмы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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