Size: a a a

2020 June 02

K

Konstantin in pro.cxx
Можешь привести пример?
источник

AB

Aleksandr Borgardt in pro.cxx
float(color[c] )/ divider_ + adder_
 при сборке тестов  -54.71368408203125  при сборке с  pybind11  -54.713726043701171875
источник

A

Andrei Konshyn in pro.cxx
Aleksandr Borgardt
float(color[c] )/ divider_ + adder_
 при сборке тестов  -54.71368408203125  при сборке с  pybind11  -54.713726043701171875
у тебя нет такой точности
-54.71368408203125
источник

A

Andrei Konshyn in pro.cxx
точности такой нет, у флоата 8-9 цифр, но результат все равно не совпадает... хм
источник

A

Andrei Konshyn in pro.cxx
Aleksandr Borgardt
float(color[c] )/ divider_ + adder_
 при сборке тестов  -54.71368408203125  при сборке с  pybind11  -54.713726043701171875
попробуй проверить в своих тестах с дабл
выглядит как будто реально pybind11 дергает дабл 🤷‍♂️
источник

PK

Pavel Kazakov in pro.cxx
Aleksandr Borgardt
float(color[c] )/ divider_ + adder_
 при сборке тестов  -54.71368408203125  при сборке с  pybind11  -54.713726043701171875
и ты для тестов с флоатами epsilon не использовал никогда? т.е. вот такой тест был чтоли?
auto const result = float(color[c] )/ divider_ + adder_;
auto const reference = -54.71368408203125f;
ASSERT_EQ(result, reference);

в тестах с флоатами всегда надо с эпсилоном сравнивать числа, чтобы не было таких результатов

и проверь флаги компиляции, мб там где-то fast_math включен был?
вообще 8-9 знаков после запятой — это оптимистично как-то, я бы проверил сколько на самом деле
источник

PK

Pavel Kazakov in pro.cxx
хотелось бы настоящих сварщиков услышать, но мой мутный хрустальный шар только такое выдает :(
источник

AB

Aleksandr Borgardt in pro.cxx
Pavel Kazakov
и ты для тестов с флоатами epsilon не использовал никогда? т.е. вот такой тест был чтоли?
auto const result = float(color[c] )/ divider_ + adder_;
auto const reference = -54.71368408203125f;
ASSERT_EQ(result, reference);

в тестах с флоатами всегда надо с эпсилоном сравнивать числа, чтобы не было таких результатов

и проверь флаги компиляции, мб там где-то fast_math включен был?
вообще 8-9 знаков после запятой — это оптимистично как-то, я бы проверил сколько на самом деле
поводу количества чисел это мой касяк  std::cout.precision(10);  а вот  fast_math не используется
источник

PK

Pavel Kazakov in pro.cxx
11 gcc, linux, 20 плюсы, код
std::cout << std::numeric_limits<float>::digits10;
выдает 6, так что про оптимистичность 8-9 знаков я был прав в этом сценарии
источник

v

vehlwn in pro.cxx
Aleksandr Borgardt
а как узнать текушю точность ?
std::numeric_limits::digits
источник

AB

Aleksandr Borgardt in pro.cxx
это поправлю а что делать с точностью
источник

v

vehlwn in pro.cxx
Aleksandr Borgardt
это поправлю а что делать с точностью
Какой точностью? Я только что показал как пользоваться буст длиннофлотами.
источник

PK

Pavel Kazakov in pro.cxx
Aleksandr Borgardt
это поправлю а что делать с точностью
если в тестах примерно вот такой код, то так не надо делать :)
https://stackoverflow.com/a/2909445/7561577 (на 5000 итераций ошибка аж до 0.05 докатилась)

используй руками std::numeric_limits<float>::epsilon() для сравнений результатов, если тестовый фреймворк не имеет чего-то вроде ALMOST_EQUAL или EXPECT_FLOAT_EQ, EXPECT_NEAR или аналогичной макросни
источник

AB

Aleksandr Borgardt in pro.cxx
запустил тесты из  модуля так что бы условия были равными  округление ведет себя подругому :(
источник

IA

Igor Akhmetov in pro.cxx
Aleksandr Borgardt
запустил тесты из  модуля так что бы условия были равными  округление ведет себя подругому :(
Проверь текущие флаги через _controlfp или ее аналог https://docs.microsoft.com/ru-ru/cpp/c-runtime-library/reference/control87-controlfp-control87-2
источник

m

magras in pro.cxx
Pavel Kazakov
если в тестах примерно вот такой код, то так не надо делать :)
https://stackoverflow.com/a/2909445/7561577 (на 5000 итераций ошибка аж до 0.05 докатилась)

используй руками std::numeric_limits<float>::epsilon() для сравнений результатов, если тестовый фреймворк не имеет чего-то вроде ALMOST_EQUAL или EXPECT_FLOAT_EQ, EXPECT_NEAR или аналогичной макросни
м... epsilon() обычно нужно умножать на что-то. Честно оценивать точность результата после нетривиального преобразования довольно муторно.
источник

PK

Pavel Kazakov in pro.cxx
magras
м... epsilon() обычно нужно умножать на что-то. Честно оценивать точность результата после нетривиального преобразования довольно муторно.
тут надо на тест сам смотреть, да, я к этому косвенно и призывал; но совсем без эпсилона и пытаться с ним — две большие разницы, — стоит вникнуть нафиг всё это нужно и переписать плохие тесты, если уж сборка настолько отличается
источник

m

magras in pro.cxx
Но вообще здесь как мне кажется вопрос не в точности, а в воспроизводимости.
источник

m

magras in pro.cxx
Вообще если подумать, кажется же можно сделать оценку точности на шаблонах. Кажется это решает все проблемы. Интересно нет ли готовой либы, которая могла бы выдавать точность для любого выражения построенного на ее обертке вокруг float/double?
источник

PK

Pavel Kazakov in pro.cxx
умные дядечки с cppcon что-то про либы, которые реализуют safe numerics, говорили, — я бы сначала в эту сторону смотрел
источник