LINUX.ORG.RU

Попробуйте не log(), а logl(). Так же интересно, какой конкретно FPU или библиотеку для вычисления использовали?

LLM-9000
()

Зависит от реализации.

Нет конкретной константы, означающей log(√2), поэтому текущая реализация сначала вычисляет √2 (хотя это может быть предрассчитанный константой, которая, несмотря на это, тоже может отличаться от версии к версии), затем вычисляет log, что уже 100% требует математических инструкций, а следовательно зависит от типов округления, доступной точности, реализации div в камне и прочем.

Я, в своё время, был удивлён «плавающим» результатам, когда делал предрассчитанный аналог таблиц Брадиса для корня.

PPP328 ★★★★★
()

для начала код в godbolt вбей посмотреть что за команды генерируются и генерируются ли вообще

ckotctvo
()
Ответ на: комментарий от cobold

Самый правильный комментарий в треде 🤣

aol ★★★★★
()
Ответ на: комментарий от PPP328

Я M_SQRT2 пихаю в качестве аргумента, она более-менее одинаковая для fp32, отличия если и есть в math.h то уже для двойной точности.

luke ★★★★★
() автор топика
Ответ на: комментарий от ckotctvo

Я умею object dump дергать, суть не в этом же.

Но мысль глянуть другие платформы хороша, типа того же арма

luke ★★★★★
() автор топика
Ответ на: комментарий от luke

riscv zfinx

Ага, ну там, насколько помню, есть только fsqrt.s, которая вычисляет все биты мантиссы. Так что далее интересно как реализован логарифм. Рядом Тейлора, вестимо, как и везде. Так что это дело скорее всего поправимо.

LLM-9000
()
Ответ на: комментарий от LLM-9000

А, кстати, тот что ожидается это zfinx и newlib, а то что получается это уже кастомное расширение, причем на симуляторе. Симулятор через soft float реализован, но меня терзают смутные сомнения что кто-то там подвирает.

То что ожидается оно хоть zfinx хоть x86, получается примерно одно и то же. Я даже на Macintosh Classic проверял, какая либо в mpw я хз, но результат получился ожидаемым.

luke ★★★★★
() автор топика
Ответ на: комментарий от luke

С того что это написано в мануалах на rcpss, rsqrtss, vrecpe, fsin, fcos.

Кроме того на разных машинах будет использоваться разный набор sse-ускорялок, по итогу на одном камне будет считаться в 64 бита, на втором в 80.

Ещё есть флаги поведения 0/NaN/subnormals, когда дефолтные положения свича ftz/daz влияют на то, что конкретно вернётся около «спорных» значений (например сверхмалых величинах), плюс в ту же копилку то, что разные поколения по разному могут сохранять плюс/минус нуль в результатах (нарушения стандарта нет, но дальше может пойти по разным веткам из-за разного знака)

Ещё можно вспомнить лотерею с fdiv на первых пеньках.

PPP328 ★★★★★
()
Ответ на: комментарий от luke

Мне кажется в компах сначала идёт оптимизация всей формулы, а потом вычисление, а не сразу вычисление, поэтому результат в зависимости от возможностей железа. В библиотеке могут быть свои методы и коррекции, функция может выдать несколько значений например приблизительное, точное(формулой), верхнее, нижнее, быстрое. Но я не математик и даже не программист.

bbgg
()
Последнее исправление: bbgg (всего исправлений: 1)
Ответ на: комментарий от PPP328

когда дефолтные положения свича ftz/daz влияют на то, что конкретно вернётся около «спорных» значений

Это я проверил, все режимы округления меняют мантиссу на единицу, ну может быть на двойку, но чтобы на 256 – такого не видел.

итогу на одном камне будет считаться в 64 бита, на втором в 80.

80 это ж 8087, в SSE 64 бита емнип.

на разных машинах будет использоваться разный набор sse-ускорялок

Ну я думал что если софтовая библиотека позиционирует себя как референсная моделька, то ускорялки ей не нужны.

luke ★★★★★
() автор топика
Ответ на: комментарий от luke

Это можно, вопрос только какие

А @Qui-Gon не научил Оби-Вана?

Не смог удержаться. :)

dataman ★★★★★
()
Ответ на: комментарий от luke

Ну я думал что если софтовая библиотека позиционирует себя как референсная моделька

Афганистан тоже позиционирует себя как образцовый.

Чекайте:

-O0 -fno-fast-math -fmath-errno -frounding-math -ftrapping-math

Если по прежнему не эталон - то ваша сборка libm - говно

PPP328 ★★★★★
()
Ответ на: комментарий от PPP328

Если по прежнему не эталон - то ваша сборка libm - говно

Вот у меня это же подозрение. Ну, буду тыкать разрабов EDA тулзы что они туда внутрь такого наворотили, что симулятор на 256 единиц убегает.

luke ★★★★★
() автор топика
Ответ на: комментарий от luke

Точность снизится из-за умножения же.

Не должна. f * 0.5 это равнозначно f.exp--. На x86, например, именно так и происходит.

LLM-9000
()
Ответ на: комментарий от luke

А ответ-то какой правильный?

Например, Σ(k=0 to +inf)(1/(2k+1)3^(2k+1))

#include <math.h>
#include <stdio.h>

int main() {
        float f;
        int i;

        f = 0.5 * logf(2.0);
        printf("%f %08X\n", f, *(int *)&f);

        for (f = 0.0, i = 0; i < 7; i++) {
                f += 1.0 / ((2 * i + 1) * powf(3, 2 * i + 1));
        }

        printf("%f %08X\n", f, *(int *)&f);
        return 0;
}
0.346574 3EB17218
0.346574 3EB17218

Это всё очень топорно, но подтверждает вывод который вы и так уже сделали: нужно копать в сторону libm / soft float.

LLM-9000
()
Ответ на: комментарий от luke

А ответ-то какой правильный?

согласно отцам зависит от дальнейшего использования

может тебе ваще тока первые биты нужны :)

qulinxao3 ★☆
()
Ответ на: комментарий от LLM-9000

Ну в принципе gnu mpfr такой же ответ показывает…

luke ★★★★★
() автор топика
Ответ на: комментарий от qulinxao3

Я в физике привык уже от греха подальше всё в двойной точности считать. Но вот тут одинарная точность под руку попалась, все говорят – забей, а я чёт упёрся.

luke ★★★★★
() автор топика
Ответ на: комментарий от AntonI

Ну тут же вопрос скорее не как считать, а можно ли доверять третьим лицам что они посчитале за тебя правильно, так чтобы я в коде дёрнул log() и не думал почём зря.

luke ★★★★★
() автор топика
Ответ на: комментарий от itn

Заголовок многообещающий.

luke ★★★★★
() автор топика
Ответ на: комментарий от luke

Ну всегда можно взять экспоненту, результат возвести в квадрат и посмотреть насколько там похоже на двойку?

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

Корень из двух тут как пример что на входе подаётся и какой косячный результат. Могу другой пример показать, надо? Уверен там логарифм от двойки так же косячно реализован как и логарифм от корня из двух.

luke ★★★★★
() автор топика
Ответ на: комментарий от itn

Забавная статья, действительно. Покажу коллегам.

luke ★★★★★
() автор топика
Ответ на: комментарий от AntonI

Можно и солнце вручную закатывать.

Щас вот глянул как в ЦЕРНовском руте логарифм реализован. Знаешь как? Через вызов стандартной функции.

luke ★★★★★
() автор топика
Ответ на: комментарий от AntonI

А надо правильно. Они же для генерации случайных чисел rand() из стандартной библиотеки не дёргают, почему-то запариваются с генераторами…

luke ★★★★★
() автор топика
Ответ на: комментарий от luke

Я в физике привык уже от греха подальше всё в двойной точности считать.

И это правильно

Но вот тут одинарная точность под руку попалась

Как-то странно звучит - «попалась». Для использования одинарной точности нужны хорошие обоснования. Например, если точность вообще не важна, или с двойной точностью получается слишком медленно, или слишком много памяти ест.

annulen ★★★★★
()
Ответ на: комментарий от LLM-9000

А ларчик просто открывался:

  /* Use Newton's method with 4 terms. */
  z += z * w * (a[0]) / ((w + 1.0) * w + b[0]);

Код был честно стырен из newlib.

luke ★★★★★
() автор топика
Ответ на: комментарий от luke

я пересмотрел свои взгляды

когда в статье академической связанной с обучением объяснялась и подчёркивалась важность натурного эксперимента в процессе обучения не последних недоPhD и где-то в конце статьи оказывалось что натурный эксперимент(демонстрационный ибо) был оказывается компьютерной симуляцией в которой обучаемый делал дейстия

лол в том что очевидно что в реальности репертуар косяков обучаемого ширшее чем в учебном кохплютерном симе

после этого церн норм

qulinxao3 ★☆
()
Ответ на: комментарий от luke

Странная аналогия. Стандартный rand можно дёргать если устраивает его повторяемость. Если не устраивает - надо дёргать другие генераторы, которые на минуточку тоже из стандартной библиотеки.

Типа стандартная библиотека вся неправильная?:-)

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от annulen

В целом верно, но есть нюансы - скорее двойная точность нужна там, где есть основания считать что одинарной не хватит.

Если таких оснований нет - зачем платить больше?

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

Стандартный rand можно дёргать если устраивает его повторяемость

Его можно для видеоигр использовать. Для физики можно получить очень интересные результаты.

Вот как это делается в ЦЕРНе: https://root.cern.ch/doc/master/classTRandom.html

В принципе, в плюсовой библиотеке есть такие же генераторы. Но чтобы в сях такое было я не помню.

Типа стандартная библиотека вся неправильная?:-)

Если брать математику, вопрос в том насколько она следует стандарту IEEE-754.

luke ★★★★★
() автор топика
Ответ на: комментарий от qulinxao3

в реальности репертуар косяков обучаемого ширшее чем в учебном кохплютерном симе

это да

церн норм

Ну в целом да, играют как умеют.

luke ★★★★★
() автор топика
Ответ на: комментарий от annulen

Как-то странно звучит - «попалась».

Игрался с RISC-V, решил копнуть FPU и понеслась…

Щас в нейронках вообще fp4 популярность набирает, говорят…

luke ★★★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.