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

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

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

Сообщение NOVA 27 мар 2019, 18:23

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

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

Сообщение Jarico 27 мар 2019, 18:44

Бери 2,3,4 или 5 чисел после запятой... Зачем брать дальше?
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

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

Сообщение NOVA 27 мар 2019, 18:48

Да я тоже так думал, но может уравнение именно при этом условии даёт коэффициент A = 0 умноженный на переменную X^8. Это значит, что переменную X^8 можно выкинуть из системы. Но может это работает при этом условии задачи. У условий задач бесконечное множество. Проверить сокращение коэффициента A до нуля можно только практическим способом, ибо гуманитарным придётся целый год сокращать. Так как система уравнений состоит из трёх уравнений четвёртой степени, то решение данного вопроса очень актуально
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

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

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

Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

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

Сообщение NOVA 27 мар 2019, 19:02

1max1 писал(а):Зачем так париться?
https://docs.unity3d.com/ScriptReferenc ... ately.html

Ой а поподробнее можно пожалуйста. Первый раз вижу. Что конкретно делает функция?
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

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

Сообщение NOVA 27 мар 2019, 19:21

Чот про сглаживания прочитал.
Вы не понимаете. Надо идеально точные значения.
Вот система
>>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 нулей после запятой.
Но это при искуственно - поставленом мною условии. А условий для решения уравнений бесконечное множество. Можно конечно попробовать в условие рандомайзер забить и следить за коэффициентами. Какую - нибудь вершину основания тетраэдра мотать в пространстве и следить за коэффициентами. Но считаю - подход не правильный.

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

Система хитропопая. Решается попарной подстановкой. И всегда на выходе три уравнения. И когда я выхожу на переменную одно степени - получаю числа приближённые к нулю.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

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

Сообщение 1max1 27 мар 2019, 19:35

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

Но если сильно надо, то смотри в сторону длинной арифметики.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

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

Сообщение NOVA 27 мар 2019, 19:40

Ясно. А integer ошибок не даёт? Со значениями под миллиард? Ну запишу я в интегер косинусы помноженные на миллиард. Тогда то точно я всё увижу.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

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

Сообщение 1max1 27 мар 2019, 20:06

Максимум для uint это 4,294,967,295 смотри чтобы не вылетело за пределы)
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

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

Сообщение NOVA 27 мар 2019, 20:38

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

Спасибо. А сами косинусы уже идут с ошибкой блин. Но хотя... Их умножения уже без ошибок пойдут.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

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

Сообщение Woolf 28 мар 2019, 03:32

эм.. а double не вариант?
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

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

Сообщение NOVA 28 мар 2019, 16:44

Woolf писал(а):эм.. а double не вариант?

Ни разу не пробовал. Чот не нашёл подробной инфы, как этим пользоваться. Понял что производить действия в этом виде нельзя.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

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

Сообщение seaman 28 мар 2019, 17:54

Уберите в Mathf последнюю букву 'f' и обрадуйтесь работой с double!
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

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

Сообщение NOVA 28 мар 2019, 18:26

Вы не представляете какие чудеса творит float. было уравнение, где левая часть равна правой. Перенёс одну константу из 20 в правую часть с другим знаком и ошибка аж в семь целых....
А как их (double) объявлять?
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

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

Сообщение 1max1 28 мар 2019, 18:45

А как их (double) объявлять?

Ты такие каверзные вопросы задаешь и не знаешь что такое double? :))
Это всё равно что если бы Билл Гейтс спросил как открыть панель управления на винде...
Синтаксис:
Используется csharp
double value = 1.5; // Тоже что и float, но точнее в 2 раза, потому и называется double
 
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

След.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: GoGo.Ru [Bot], Google [Bot] и гости: 26