Войти
ПрограммированиеФорумГрафика

Математическая библиотека для физики и графики..и.т.д ! (7 стр)

Страницы: 1 2 3 4 5 6 7
#90
12:50, 28 янв. 2019

werasaimon

приветствую.

возможно пригодится, если найдёш в коде что-то полезное:

1.сам код:  https://bitbucket.org/heldercorreia/speedcrunch/src

2. страница проекта: http://speedcrunch.org


#91
23:12, 28 янв. 2019

/A\
> Без юнит тестов этой математической библиотекой никто не будет пользоваться
> кроме тебя.

А вот кстати, как правильно тестировать?

Допустим, функция ищет и возвращает точку пересечения прямой и отрезка в 2d или 3d. В связи с неточностями float, хотелось бы проверять не только тривиальные случаи, а множество вариантов взаимного расположения фигур. Бывает, что заметная ошибка вылезает только в специфических случаях, когда они, например, почти параллельны или почти перпендикулярны. Причём надо проверять фигуры и около начала координат и вдалеке.

Чтобы сверить результаты с правильными, надо правильные результаты откуда-то взять. А откуда их брать в таком количестве и с идеальной точностью?

Я свою библиотеку веду, тесты какие-то очевидные добавляю, но это тесты из разряда школьных задачек по математике, где исходные данные обычно подобраны так, чтобы ответ получался красивый целочисленный. Всё вроде работает, но нет уверенности, что библиотека не выдаст бред в каком-нибудь простом, но непротестированном случае. Тесты конечно ничего не гарантируют, но чем их больше, тем надёжнее.

werasaimon
> P.S: короче я не знаю почему , но SIMD даёт ничтожно малый процент
> производительности на i386 ?

У i386 не было SIMD-инструкций. У него даже FPU не было.

#92
23:33, 28 янв. 2019

alexzzzz
> А вот кстати, как правильно тестировать?
Я делаю несколько "слоев" тестирования:
1. юнит тесты, обычно проверяешь все ветви циклов и частые сценарии использования.
2. параноик чек, вставляешь ассерты в мат функции чтоб найти NaN и проблемы с точностью, можно еще параллельно считать в фиксед поинтах или даблах, это только в дебаге.
3. видишь, что что-то не так, берешь дебагер, находишь проблему, пишешь юнит тест, фиксишь.

#93
(Правка: 1:12) 0:30, 29 янв. 2019

Из опыта своей математической библиотеки:


Полезна возможность задавать точность вычислений. Полезнее даже не столько возможность эти числа менять, сколько возможность их заранее понимать.

Допустим, если установить минимальное расстояние в 0,001 и минимальный угол в 0,1°, то все функции, где внутри сравниваются расстояния и направления, должны руководствоваться именно этими числами, а не собственными магическими константами.


Библиотека общего назначения должна быть предсказуемой.

Например, если она утверждает, что прямая a параллельна b и перпендикулярна c, то хотелось бы, чтобы b и c тоже оказались перпендикулярны.

Простейший тест на параллельность/перпендикулярность ― сравнить скалярное произведение векторов с нулём или с ±1. Но сравнение скалярного произведения ― это по сути сравнение косинуса, который в районе нулевых углов практически не меняется, а в районе 90° у него производная -1. Как результат, проверка на параллельность получается слишком грубая, а на перпендикулярность ― слишком точная (а может наоборот :)).

Т.е. сравнивать надо не косинусы с 0 и 1, а сами углы с 0° и 90°. Либо в разных случаях сравнивать косинусы с разными эпсилонами ― один для углов близких к нулю, другой для углов близких к 90°.


Если функция, считающая расстояние от точки до плоскости, вернула значение меньше установленного минимального расстояния (пусть 0,001); то функция, определяющая принадлежность точки плоскости, обязана на этих же исходных данных давать положительный ответ ― да, принадлежит.

Если минимальный угол установлен в 0,1°, то всё, между чем угол меньше, во всех функциях должно считаться параллельным. Если один из векторов/отрезков/лучей/прямых/плоскостей взять и повернуть ровно на 90°, то всё, что было ему параллельным, обязано стать перпендикулярным. Чтобы без сюрпризов.


PS
Самый гадский геометрический примитив ― дуга окружности или сектор. Просто поле для косяков. Пишешь тесты ― не работает, исправляешь; пишешь ещё тесты ― не работает, исправляешь; пишешь ещё тесты ― не работает, исправляешь...

#94
0:44, 29 янв. 2019

Нет ли какого-нибудь готового сводного списка правил хорошего тона при обращении с вещественными числами?

Типа,
1. Не складывайте большие числа с маленькими.
2. Не берите корень из чисел, близких к единице.
3. ...

#95
1:36, 29 янв. 2019

Мне больше нравится вот это
https://github.com/RandyGaul/cute_headers
А вообще кт омешает взять мат-либу булета.

#96
(Правка: 21:34) 21:25, 10 фев. 2019

lookid
> А вообще кт омешает взять мат-либу булета.
Она отвратительна , и мало функциональная !

alexzzzz
> Допустим, если установить минимальное расстояние в 0,001 и минимальный угол в
> 0,1°, то все функции, где внутри сравниваются расстояния и направления, должны
> руководствоваться именно этими числами, а не собственными магическими
> константами.
Да все верно . Поетому я именно так и делаю !

Страницы: 1 2 3 4 5 6 7
ПрограммированиеФорумГрафика