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

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

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

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

Да яж написал, что не знал что это. Погуглил. Существует ещё decimal.
Но походу проблема совсем не во float. А в методах решения системы. Методом попарной подстановки в системе из трёх уравнений четвёртой степени я получаю систему из трёх уравнений второй степени. Типа
SM^2 = блабла1.
SM^2 = блабла2.
SM^2 = блабла3.
Все блабла практически равны нулю. А длина SM - конкретная величина. А все предыдущие решения проверены на практике с незначительными ошибками.
Что это значит ? Я кажется понял. А вы знаете, как решать систему из трёх уравнений с одной переменной? То есть я что хочу сказать. Абсолютно точно существует система из трёх уравнений стопроцентно проверенная. С одной переменной в квадрате. Причем зная решение я подставляю эту переменную и система работает со всеми тремя уравнениями.... Но я не могу получить эту переменную в квадрате ни из одного уравнения. Как такое может вообще быть? Это система линейных уравнений гомографии треугольника. На практике методом подстановки система должна иметь только одно решение с положительным множителем длины векторов. И считается моментально.

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

СообщениеДобавлено: 28 мар 2019, 21:50
alew
А чуму равен косинус > 360 или синус < 0 ??? :-o

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

СообщениеДобавлено: 29 мар 2019, 04:53
NOVA
Вот и я о том же. Кто придумал этого Пифагора с Декартом? Очень удобные посоны.
Выглядит это так.
Три уравнения, где SM^4 и SM^2 - неизвестные. Остальное перемножение косинусов и сторон треугольника.

Скрытый текст:
>>>SM4 = (SM2*K101 + K201)/K301;
>>>SM4 = (SM2*K102 + K202)/K302;
>>>SM4 = (SM2*K103 + K203)/K303;


Вывожу левую и правую часть каждого уравнения.
469.4444=469.383
UnityEngine.Debug:Log(Object)
Ок. Все три бьют. Далее попарно подставляю и выхожу на квадраты.
Скрытый текст:
//SM2*K101*K302 + K201*K302 = SM2*K102*K301 + K202*K301;
//SM2*K101*K303 + K201*K303 = SM2*K103*K301 + K203*K301;
//SM2*K102*K303 + K202*K303 = SM2*K103*K302 + K203*K302;

Вывод
Скрытый текст:
6.023673E-13=6.023673E-13
7.210825E-12=7.210824E-12
1.450392E-12=1.450392E-12

Далее перебрасываю неизвестные влево.
Скрытый текст:
//SM2*(K101*K302 - K102*K301) + K201*K302 = + K202*K301;
//SM2*(K101*K303 - K103*K301) + K201*K303 = + K203*K301;
//SM2*(K102*K303 - K103*K302) + K202*K303 = + K203*K302;

Вывод
Скрытый текст:
-8.988893E-13=-8.988893E-13
-1.076043E-11=-1.076044E-11
-2.164363E-12=-2.164364E-12


Известные вправо.
Скрытый текст:
//SM2*(K101*K302 - K102*K301) = + K202*K301 - K201*K302;
//SM2*(K101*K303 - K103*K301) = + K203*K301 - K201*K303;
//SM2*(K102*K303 - K103*K302) = + K203*K302 - K202*K303;

Вывод.

Скрытый текст:
Матерь божья как так то?!!!!
-4.038614E-20=2.546844E-20
7.021927E-19=-1.673251E-19
2.384822E-19=-9.497933E-20

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

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

Чот не получается никак.
Скрытый текст:
Изображение

Версия unity 5.6.1f

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

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

Чот не получается никак.
Скрытый текст:
Изображение

Версия unity 5.6.1f

Синтаксис:
Используется csharp
using System;

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

СообщениеДобавлено: 29 мар 2019, 18:06
NOVA
Saltant писал(а):
NOVA писал(а):
seaman писал(а):Уберите в Mathf последнюю букву 'f' и обрадуйтесь работой с double!

Чот не получается никак.
Скрытый текст:
Изображение

Версия unity 5.6.1f

Синтаксис:
Используется csharp
using System;


Спасибо! А Decimal ещё не родилось в unity?

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

СообщениеДобавлено: 29 мар 2019, 18:30
1max1
А при чем тут юнити? decimal тип из c# такой же как и флоат и дабл.

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

СообщениеДобавлено: 29 мар 2019, 18:35
NOVA
А ТЕПЕРЬ ВНИМАНИЕ - РЕЗУЛЬТАТЫ. Я кажется поломал алгебру.

Скрытый текст:
Изображение


Вывод Debug где левая часть уравнения должна быть равна правой.
Три результата.
Скрытый текст:
Изображение


Далее переношу постоянные в правую часть уравнения, оставляя SM2 в левой.

Скрытый текст:
Изображение


Вывод.
Скрытый текст:
Изображение


@-)
Кажется пора в церковь сходить. ^:)^

Как блин из равенства можно получить неравенство переносом одного числа????????

Там заметны симметричные результаты, скоро доэксперементируюсь и портал в параллельный мир открою. Мракобесие какое-то.

А дайте пожалуйста информацию по Decimal? Как объявлять и оперировать? Так я не хочу упрощать 150 произведений.

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

СообщениеДобавлено: 29 мар 2019, 19:09
1max1
Попробуй раскрыть скобки:
Синтаксис:
Используется csharp
double Left1 = SM2 * K101 * K302 - SM2 * K102 * K301;
double Right1 = +K202 * K301 - K201 * K302;

Я думаю decimal не спасет, числа реально очень маленькие.

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

СообщениеДобавлено: 29 мар 2019, 19:16
NOVA
1max1 писал(а):Попробуй раскрыть скобки:
Синтаксис:
Используется csharp
double Left1 = SM2 * K101 * K302 - SM2 * K102 * K301;
double Right1 = +K202 * K301 - K201 * K302;

Я думаю decimal не спасет, числа реально очень маленькие.

Всё тоже самое. И вылазит такое маленькое число из-за перемножений кучи косинусов. До аж 6 степени. Блин это же всего лишь треугольник в пространстве... Может оставить тот вариант где было квадратное уравнение SM4 + SM2 + блабла = 0.
Попробовать дискриминант и корни.

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

СообщениеДобавлено: 29 мар 2019, 22:24
NAGIBATOR228pacan
А как кто-то писал выше в инт или лонг лонг уинт засунуть нельзя? Потом делить просто

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

СообщениеДобавлено: 29 мар 2019, 22:30
1max1
Подожди еще полвека, когда выйдут суперкомпьютеры, тогда и будешь перемножать свои числа с ювелирной точностью))

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

СообщениеДобавлено: 29 мар 2019, 22:32
NOVA
1max1 писал(а):Подожди еще полвека, когда выйдут суперкомпьютеры, тогда и будешь перемножать свои числа с ювелирной точностью))

Ждать не нужно. Надо найти способ обойти. Раз система выводит на комплексное решение - значит это война алгебре. Решение в любом случае есть.
Кто нибудь делал вообще гомографию треугольника в пространстве кроме меня? Хоть каким нибудь способом. В интернетах я только дичь какую-то начитал.

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

СообщениеДобавлено: 29 мар 2019, 22:45
NAGIBATOR228pacan
Сейчас я скорее всего скажу полную херь:
Кароче для повышения точности чтобы не возникало проблем когда что-то на что-то не делится без периода можешь хранить числа не как десятичная дробь как это делается по умолчанию, а как обычная где числитель и знаменатель это инт, а переводишь во флоат только в самом конце вроде это должно решить проблемы с точностью, только надо использовать 64 и 128 битный инт, и то не факт что тебе их хватит

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

СообщениеДобавлено: 29 мар 2019, 22:49
NOVA
NAGIBATOR228pacan писал(а):Сейчас я скорее всего скажу полную херь:
Кароче для повышения точности чтобы не возникало проблем когда что-то на что-то не делится без периода можешь хранить числа не как десятичная дробь как это делается по умолчанию, а как обычная где числитель и знаменатель это инт, а переводишь во флоат только в самом конце вроде это должно решить проблемы с точностью, только надо использовать 64 и 128 битный инт, и то не факт что тебе их хватит

Мысль вроде бы хорошая, только это всё переводить я закончу через 30 лет после пенсиии. Пока что просто посокращаю константы ещё годик. Чёртов Пифагор кто тебя такого придумал.