Страница 8 из 9 ПерваяПервая ... 6789 ПоследняяПоследняя
Показано с 71 по 80 из 85

Тема: Логарифм макрос

  1. #71
    Пользователь
    Регистрация
    21.01.2011
    Адрес
    еБург
    Сообщений
    890

    По умолчанию

    Цитата Сообщение от vladimirisitnikov Посмотреть сообщение
    Почему первые биты определяются пачками (через CD32), а остальные по одному?
    спасибо за идею... надо подумать..
    начинающий профессионал

  2. #72
    Пользователь
    Регистрация
    21.01.2011
    Адрес
    еБург
    Сообщений
    890

    По умолчанию

    Подумал...
    В новой версии всё так же как и в первой, т.е. работает мгновенно, во всех допустимых значениях от 0 до 3,4E+38, и точность до 1/256.
    Основное отличие - за счёт использования только CD32 получается всего 3 итерации (развёрнутых в линию, отсюда и мгновенность),
    вместо 11 в первой публичной версии макроса (или 15, если бы CD32 вообще не использовался)

    PS напомню: lb(x) - Двоичный логарифм
    ln(x)=lb(x)/lb(e)=ln(2)*lb(x) = 0,693147*lb(x)
    lg(x)=lb(x)/lb(10)=lg(2)*lb(x) = 0,30103*lb(x)
    Вложения Вложения
    • Тип файла: zip lb2.zip (150.3 Кб, Просмотров: 48)
    Последний раз редактировалось AI!; 12.06.2016 в 01:25.
    начинающий профессионал

  3. #73

    По умолчанию

    Цитата Сообщение от AI! Посмотреть сообщение
    Подумал...
    В новой версии всё так же как и в первой, т.е. работает мгновенно, во всех допустимых значениях от 0 до 3,4E+38, и точность до 1/256.
    Основное отличие - за счёт использования только CD32 получается всего 3 итерации (развёрнутых в линию, отсюда и мгновенность),
    вместо 11 в первой публичной версии макроса (или 15, если бы CD32 вообще не использовался)

    PS напомню: lb(x) - Двоичный логарифм
    ln(x)=lb(x)/lb(e)=ln(2)*lb(x) = 0,693147*lb(x)
    lg(x)=lb(x)/lb(10)=lg(2)*lb(x) = 0,30103*lb(x)
    О, здорово. Я правильно понимаю, что последней CD32(POW(x, 256))/256 цепочке на вход всегда подаются данные в диапазоне 0,9...1,1?

    Тогда можно повысить точность до 1.4e-4 == 1/6900, если использовать приближение lb(x) = 2*(x-1)/(x+1) / ln(2) вместо последней цепочки CD(POW)
    Если взять ещё один член 2*((x-1)/(x+1) + ((x-1)/(x+1))3/3) / ln(2), то точность будет почти до 1e-7.

    Вот пример такого (! на картинке два члена ряда не встроены в исходную формулу специально, чтобы сравнивать): lb2_3.png

    lb(1.01) == 0.014355292977070055
    Вариант с тремя CD32 выдаёт 1.2e-2

    Если заменить последний CD32 на ряд (из двух элементов), то получится точный ответ:
    Код:
    irb(main):009:0> x=1.01
    => 1.01
    irb(main):010:0> y=(x-1)/(x+1)
    => 0.004975124378109458
    irb(main):012:0> Math.log(1.01, 2)
    => 0.014355292977070055
    irb(main):013:0> 2*(y+y**3/3)/Math.log(2)
    => 0.014355292975311074
    Отсюда вывод: если на последнюю цепочку подаваемые значения невелики (близки к 1), то нужно заменять её на 2*(y+y**3/3)/Math.log(2)
    Последний раз редактировалось Владимир Ситников; 12.06.2016 в 23:42.

  4. #74
    Пользователь
    Регистрация
    21.01.2011
    Адрес
    еБург
    Сообщений
    890

    По умолчанию

    Цитата Сообщение от vladimirisitnikov Посмотреть сообщение
    lb(1.01) == 0.014355292977070055
    Вариант с тремя CD32 выдаёт 1.2e-2
    я же сказал - точность до 1/256 (~0,004), правда забыл уточнить, что округление всегда в меньшую сторону (по модулю)
    откуда ваша формула? можно ссылку?

    PS тем временем сделал вариант с 4мя итерациями, получается точность 1/8192,
    так же добавил выходы с ln(x) и lg(x), с учётом понижающего коэффициента, точность получается 1e-4
    Вложения Вложения
    • Тип файла: zip log.zip (198.0 Кб, Просмотров: 31)
    Последний раз редактировалось AI!; 13.06.2016 в 00:00.
    начинающий профессионал

  5. #75

    По умолчанию

    Цитата Сообщение от AI! Посмотреть сообщение
    я же сказал - точность до 1/256 (~0,004), правда забыл уточнить, что округление всегда в меньшую сторону (по модулю)
    Это понятно. Я про то, что для близких к 1 значений можно вместо CD32 использовать ряд и тем самым повысить точность.

    Цитата Сообщение от AI! Посмотреть сообщение
    откуда ваша формула? можно ссылку?
    7-е сообщение в этой теме, 1-ая ссылка.

    Могу повторить: https://ru.wikipedia.org/wiki/%D0%9B....D1.8F.D0.B4_2
    Последний раз редактировалось Владимир Ситников; 13.06.2016 в 00:09.

  6. #76
    Пользователь
    Регистрация
    21.01.2011
    Адрес
    еБург
    Сообщений
    890

    По умолчанию

    Цитата Сообщение от vladimirisitnikov Посмотреть сообщение
    то точность будет почти до 1e-7.
    Убедили.
    Новая версия, на этот раз только натуральный логарифм (как самый востребованный)
    И точность, с ваших слов, почти до 1e-7
    Вложения Вложения
    • Тип файла: zip ln.zip (170.6 Кб, Просмотров: 55)
    начинающий профессионал

  7. #77

    По умолчанию

    Цитата Сообщение от AI! Посмотреть сообщение
    Убедили.
    Новая версия, на этот раз только натуральный логарифм (как самый востребованный)
    И точность, с ваших слов, почти до 1e-7
    CD32 выдаёт "оценку логарифма снизу". Значит, на 2(y+y3/3) подаются числа больше 1. Будут ли все они меньше 1.1? Без понятия (==надо вдумчиво курить CD32), но по нескольким тестам все они оказываются меньше 1.1

    Вот график ln(x)-2(y+y3/3) (диапазон по вертикали: -1e-8 .. 1e-7):
    Снимок экрана 2016-06-13 в 11.05.03.png
    Изображения Изображения

  8. #78
    Пользователь
    Регистрация
    21.01.2011
    Адрес
    еБург
    Сообщений
    890

    По умолчанию

    Цитата Сообщение от vladimirisitnikov Посмотреть сообщение
    Будут ли все они меньше 1.1? Без понятия
    да.
    то что на входе 3ей итерации даёт ответ строго меньше 1/8,
    т.е. на входе оной будет строго меньше 2^(1/8)~1,09050

    PS может всё же вернуть на место 3ю итерацию?
    а с помощью рядов считать 4ую, и на входе рядов будет меньше 2^(1/256)~1,0027
    Последний раз редактировалось AI!; 13.06.2016 в 11:48.
    начинающий профессионал

  9. #79
    Пользователь
    Регистрация
    21.01.2011
    Адрес
    еБург
    Сообщений
    890

    По умолчанию

    Цитата Сообщение от AI! Посмотреть сообщение
    да.
    то что на входе 3ей итерации даёт ответ строго меньше 1/8,
    т.е. на входе оной будет строго меньше 2^(1/8)~1,09050
    ещё подумал..... и просто сдвинул "ожидаемый ответ" от 3ей итерации с (0..1/8) на (-1/16..1/16)
    т.е. на входе оной вместо (1;1,09050) будет (0,95760;1,04427), что ещё повысит точность...
    Вложения Вложения
    • Тип файла: zip ln.zip (173.7 Кб, Просмотров: 77)
    Последний раз редактировалось AI!; 13.06.2016 в 14:49.
    начинающий профессионал

  10. #80

    По умолчанию

    Цитата Сообщение от AI! Посмотреть сообщение
    да.
    то что на входе 3ей итерации даёт ответ строго меньше 1/8,
    т.е. на входе оной будет строго меньше 2^(1/8)~1,09050

    PS может всё же вернуть на место 3ю итерацию?
    а с помощью рядов считать 4ую, и на входе рядов будет меньше 2^(1/256)~1,0027
    А смысл возвращать третью итерацию cd32? 1.09 вполне достаточно для ряда. А fpow 256 вряд ли положительно скажется на скорости.

Страница 8 из 9 ПерваяПервая ... 6789 ПоследняяПоследняя

Похожие темы

  1. Макрос внутри макроса ?
    от iman в разделе Программируемые реле
    Ответов: 3
    Последнее сообщение: 03.10.2015, 20:49
  2. Макрос побитного вывода сигнатуры (beeper)
    от tigdin в разделе Программируемые реле
    Ответов: 25
    Последнее сообщение: 12.04.2015, 20:35
  3. Макрос в макросе
    от АлексPetr в разделе Программируемые реле
    Ответов: 4
    Последнее сообщение: 28.01.2015, 21:16
  4. Ответов: 12
    Последнее сообщение: 18.11.2014, 12:14
  5. Макрос
    от CEkip в разделе Программируемые реле
    Ответов: 11
    Последнее сообщение: 13.04.2012, 21:54

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •