Страница 1 из 5

Есть ли способ избежать погрешности переменной float?

СообщениеДобавлено: 27 мар 2019, 18:23
NOVA
В силу обстоятель чуть ли не по 20 умножений в одном уравнении переменных float потом их сложение и так далее. Как известно одна переменная float даёт погрешность А тут их десятки перемножаются и я не могу понять. Вот это ноль или нет?
1.382136E-05
UnityEngine.Debug:Log(Object)
Бывает и так.
1.382136E-012
Может есть какой способ контролировать это? В смысле я к тому, что если это реальный ноль, я выбрасываю из системы одну переменную. Ибо сокращать полсотни косинусов и синусов с комбинациями их степеней можно до пенсии.
Умножение всего на миллион решит проблему? Так как объекты решения косинусы углов, которые имеют предел от нуля до единицы.

Re: Есть ли способ избежать погрешности переменной float?

СообщениеДобавлено: 27 мар 2019, 18:44
Jarico
Бери 2,3,4 или 5 чисел после запятой... Зачем брать дальше?

Re: Есть ли способ избежать погрешности переменной float?

СообщениеДобавлено: 27 мар 2019, 18:48
NOVA
Да я тоже так думал, но может уравнение именно при этом условии даёт коэффициент A = 0 умноженный на переменную X^8. Это значит, что переменную X^8 можно выкинуть из системы. Но может это работает при этом условии задачи. У условий задач бесконечное множество. Проверить сокращение коэффициента A до нуля можно только практическим способом, ибо гуманитарным придётся целый год сокращать. Так как система уравнений состоит из трёх уравнений четвёртой степени, то решение данного вопроса очень актуально

Re: Есть ли способ избежать погрешности переменной float?

СообщениеДобавлено: 27 мар 2019, 18:53
1max1

Re: Есть ли способ избежать погрешности переменной float?

СообщениеДобавлено: 27 мар 2019, 19:02
NOVA
1max1 писал(а):Зачем так париться?
https://docs.unity3d.com/ScriptReferenc ... ately.html

Ой а поподробнее можно пожалуйста. Первый раз вижу. Что конкретно делает функция?

Re: Есть ли способ избежать погрешности переменной float?

СообщениеДобавлено: 27 мар 2019, 19:21
NOVA
Чот про сглаживания прочитал.
Вы не понимаете. Надо идеально точные значения.
Вот система
>>SM^8*KMBC8 + SM^6*KMBC6 + SM^4*KMBC4 + SM2^*KMBC2 = KMBC;
>>SM^8*KMAC8 + SM^6*KMAC6 + SM^4*KMAC4 + SM2^*KMAC2 = KMAC;
>>SM^8*KMAB8 + SM^6*KMAB6 + SM^4*KMAB4 + SM2^*KMAB2 = KMAB;
Где. SM неизвестная переменная.
Всё остальное - известные.
Что - то в духе.
Скрытый текст:
KMAB4 = CosMSA4*(MB2*MB2 - 2*MB2*AB2 + AB2*AB2) + CosMSA3*CosMSB*CosASB*(- 2*MA2*AB2 + 4*AB2*MB2 - 2*MA2*MB2 - 2*AB2*AB2 - 2*MB2*MB2) + CosMSA2*(3*CosMSB2*AB2*AB2 + CosMSB2*MA2*MA2 + CosMSB2*MB2*MB2 - 4*CosMSB2*MA2*AB2 - 4*CosMSB2*AB2*MB2 + CosASB2*AB2*AB2 + CosASB2*MA2*MA2 + 3*CosASB2*MB2*MB2 - 4*CosASB2*AB2*MB2 + 2*CosASB2*MA2*MB2 - 5*AB2*AB2/2 - MA2*MA2/2 - 5*MB2*MB2/2 + 3*MA2*AB2 + 5*MB2*AB2 - 3*MA2*MB2 + 4*MB2*AB2*CosMSB2*CosASB2 + 4*MA2*MB2*CosMSB2*CosASB2 + 4*MA2*AB2*CosMSB2*CosASB2) + CosMSA*CosMSB*CosASB*(4*CosMSB2*MA2*AB2 - 2*CosMSB2*MA2*MA2 - 2*CosMSB2*AB2*AB2 - 2*CosMSB2*MB2*AB2 - 2*CosMSB2*MA2*MB2 - 2*CosASB2*MA2*MA2 - 2*CosASB2*MA2*AB2 - 2*CosASB2*MB2*AB2 - 2*CosASB2*MB2*MB2 - 8*CosASB2*MA2*MB2 + AB2*AB2 + MA2*MA2 + MB2*MB2 - 2*MA2*AB2 - 2*AB2*MB2 + 10*MA2*MB2) + CosMSB4*(AB2*AB2 - 2*MA2*AB2 + MA2*MA2) + CosASB4*(MA2*MA2 + 4*MA2*MB2 + MB2*MB2) + CosMSB2*(5*MA2*AB2 + 3*AB2*MB2 - 3*MA2*MB2 - 5*AB2*AB2/2 - 5*MA2*MA2/2 - MB2*MB2/2) + CosASB2*(3*MA2*AB2 - 7*MA2*MB2 + 3*MB2*AB2 - AB2*AB2/2 - 5*MA2*MA2/2 - 5*MB2*MB2/2) + 3*AB2*AB2/2 + 3*MA2*MA2/2 + 3*MB2*MB2/2 - 3*MA2*AB2 - 3*AB2*MB2 + 3*MA2*MB2 + (3*MA2*MA2 - 4*MA2*AB2 + MB2*MB2 + AB2*AB2 + 2*MA2*MB2)*CosMSB2*CosASB2;

Это уже сокращённая запись. Дальше никак не сокращается.


Некоторые из этих коэффициентов дают значение приближённое к нулю. От 5 до 12 нулей после запятой.
Но это при искуственно - поставленом мною условии. А условий для решения уравнений бесконечное множество. Можно конечно попробовать в условие рандомайзер забить и следить за коэффициентами. Какую - нибудь вершину основания тетраэдра мотать в пространстве и следить за коэффициентами. Но считаю - подход не правильный.

Может я не знаю какой-либо полезной мне теоремы для тетраэдра в пространстве, либо её не существует. Вот например про теорему Лейбница не знал месяц назад. Хорошая она.
Но она мне не помогла.

Система хитропопая. Решается попарной подстановкой. И всегда на выходе три уравнения. И когда я выхожу на переменную одно степени - получаю числа приближённые к нулю.

Re: Есть ли способ избежать погрешности переменной float?

СообщениеДобавлено: 27 мар 2019, 19:35
1max1
Идеальной точности ты вряд ли добьешься, лучше будет определить что числа меньше определенного == абсолютный ноль.
Синтаксис:
Используется csharp
if (Mathf.Abs(value) <= 0.000001f)
    print("Практически ноль!");

Но если сильно надо, то смотри в сторону длинной арифметики.

Re: Есть ли способ избежать погрешности переменной float?

СообщениеДобавлено: 27 мар 2019, 19:40
NOVA
Ясно. А integer ошибок не даёт? Со значениями под миллиард? Ну запишу я в интегер косинусы помноженные на миллиард. Тогда то точно я всё увижу.

Re: Есть ли способ избежать погрешности переменной float?

СообщениеДобавлено: 27 мар 2019, 20:06
1max1
Максимум для uint это 4,294,967,295 смотри чтобы не вылетело за пределы)

Re: Есть ли способ избежать погрешности переменной float?

СообщениеДобавлено: 27 мар 2019, 20:38
NOVA
1max1 писал(а):Максимум для uint это 4,294,967,295 смотри чтобы не вылетело за пределы)

Спасибо. А сами косинусы уже идут с ошибкой блин. Но хотя... Их умножения уже без ошибок пойдут.

Re: Есть ли способ избежать погрешности переменной float?

СообщениеДобавлено: 28 мар 2019, 03:32
Woolf
эм.. а double не вариант?

Re: Есть ли способ избежать погрешности переменной float?

СообщениеДобавлено: 28 мар 2019, 16:44
NOVA
Woolf писал(а):эм.. а double не вариант?

Ни разу не пробовал. Чот не нашёл подробной инфы, как этим пользоваться. Понял что производить действия в этом виде нельзя.

Re: Есть ли способ избежать погрешности переменной float?

СообщениеДобавлено: 28 мар 2019, 17:54
seaman
Уберите в Mathf последнюю букву 'f' и обрадуйтесь работой с double!

Re: Есть ли способ избежать погрешности переменной float?

СообщениеДобавлено: 28 мар 2019, 18:26
NOVA
Вы не представляете какие чудеса творит float. было уравнение, где левая часть равна правой. Перенёс одну константу из 20 в правую часть с другим знаком и ошибка аж в семь целых....
А как их (double) объявлять?

Re: Есть ли способ избежать погрешности переменной float?

СообщениеДобавлено: 28 мар 2019, 18:45
1max1
А как их (double) объявлять?

Ты такие каверзные вопросы задаешь и не знаешь что такое double? :))
Это всё равно что если бы Билл Гейтс спросил как открыть панель управления на винде...
Синтаксис:
Используется csharp
double value = 1.5; // Тоже что и float, но точнее в 2 раза, потому и называется double