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

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

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

Сообщение NAGIBATOR228pacan 29 мар 2019, 22:56

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

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

Я конечно не понял что ты хочешь сделать, но зачем тебе что-то сокращать, если я понял то для того чтобы упихнуть значение в инт? Вроде это не особо то и обязательно, там 128 битный инт это просто жесть огроменное число это 4294967296*4294967296*4294967296*4294967296 и *2 если это уинт, да и функцию которая будет сокращать дробь после каждого умножения/деления и прочего довольно быстро можно написать, конечно скорее всего я не понял для чего тебе нужно сокращение и что вообще за сокращение ибо мой уровень математики не далеко ушел от умножения крестика на крестик прямиком из 6 класса, конечно я утрирую, но по сравнению с каким-то типичным знатаком математики я не далеко ушел от шестиклассника.
NAGIBATOR228pacan
UNITрон
 
Сообщения: 318
Зарегистрирован: 15 мар 2017, 20:39

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

Сообщение NOVA 30 мар 2019, 08:47

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

Известны длины ABC и все углы при S.
M - центроид треугольника, ввёл для удобства решения, чтобы избежать резольвенты. Поэтому все длины от вершин треугольника до центроида тоже известны. Надо найти все точки A B C в пространстве, то есть длины SA, SB, SC.

Зачем всё это надо?
Понять сколько решений имеет гомография треугольника из плоскости в пространство. МЕТОДОМ ЛИНЕЙНЫХ УРАВНЕНИЙ.

Всё начиналось с теоремы косинусов для каждого угла при вершине S. А потом решение квадратных уравнений для треугольников ABM, ACM, BCM. Изначально для каждого треугольника было 4 решения так как у квадратного уравнения 2 корня, но всё сошлось к одному для каждого треугольника.

Потом выросли множители вроде этих
Скрытый текст:
KMAB8 = CosMSA4 + CosMSB4 + CosASB4 - 4*CosMSA3*CosMSB*CosASB + 2*CosMSA2*CosMSB2 + 2*CosMSA2*CosASB2 + 4*CosMSA2*CosMSB2*CosASB2 - 4*CosMSA*CosMSB3*CosASB - 4*CosMSA*CosASB3*CosMSB + 4*CosMSA*CosMSB*CosASB - 2*CosMSA2 - 2*CosASB2 - 2*CosMSB2 + 2*CosMSB2*CosASB2 + 1;


Дальше вот такие.
Скрытый текст:
K61 = (KMBC6*KMAC8 - KMAC6*KMBC8);


А потом такие.
Скрытый текст:
K201 = (KMBC*KMAB8*K61 - KMAB*KMBC8*K61 - KMBC*KMAC8*K62 + KMAC*KMBC8*K62);


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

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

Сообщение Woolf 30 мар 2019, 09:55

Задача проста как три копейки. Найти решение тетраэдра

Что значит "решение тетраэдра"?
Зачем всё это надо? Понять сколько решений имеет гомография треугольника из плоскости в пространство.

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

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

Сообщение seaman 30 мар 2019, 12:10

Думаю делает восстановление трехмерности по фотке
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

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

Сообщение Woolf 30 мар 2019, 12:25

seaman писал(а):Думаю делает восстановление трехмерности по фотке

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

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

Сообщение NOVA 30 мар 2019, 13:15

Берём треугольную линейку.
Фоткаем её.
Убираем с фотки дисторсию.
Отмечаем 3 точки краёв линейки на фотке. Измеряем длины сторон треугольника
Вводим данные в уравнение.
Получаем положение и поворот треугольника в пространстве.
Все существующие решения подобных задач сводятся к матрицам и какой-то лабуде. В матрицах числа не сокращаются. Поэтому...

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

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

Сообщение NOVA 30 мар 2019, 14:23

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

Дают вполне вменяемые числа и реальный результат соответствует. Он выделен.
Скрытый текст:
Изображение


Дальше для удобства вычисления корней приведём к стандартным квадратным уравнениям.

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


Вывод. Ошибка уже в стотысячных

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

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

Сообщение NOVA 31 мар 2019, 10:45

Короче система решается биквадратными уравнениями. Получается 3 одинаково верных результата и три одинаково неверных и ещё 6 зеркальных но они не нужны. Как только перехожу на квадратные, double не тянет.
Дайте инфу по Decimal пожалуйста. Как объявлять и чем считать? А я пока поупрощаю косинусные произведения.

Скрытый текст:
K61 = KMBC6*KMAC8 - KMAC6*KMBC8;

KMBC6*KMAC8
//KMBC6 = CosMSB4*(2*BC2 - 2*MC2 - 4*CosMSC2*BC2) + CosMSB3*CosMSC*CosBSC*(8*CosMSC2*BC2 - 2*BC2 + 2*MB2 + 6*MC2) + CosMSB2*(8*CosMSC2*BC2 - 2*CosMSC2*MB2 - 2*CosMSC2*MC2 - 2*CosBSC2*MB2 + 2*CosBSC2*BC2 - 4*CosBSC2*MC2 - 4*CosMSC4*BC2 - 4*MB2*CosMSC2*CosBSC2 - 4*MC2*CosMSC2*CosBSC2 - 8*BC2*CosMSC2*CosBSC2 - 4*BC2 + 2*MB2 + 4*MC2) + CosMSB*CosMSC*CosBSC*(6*CosMSC2*MB2 - 2*CosMSC2*BC2 + 2*CosMSC2*MC2 + 6*CosBSC2*MB2 + 2*CosBSC2*BC2 + 6*CosBSC2*MC2 + 2*BC2 - 6*MB2 - 6*MC2) + 4*CosMSC2*MB2 - 4*CosMSC2*BC2 + 2*CosMSC2*MC2 + 4*CosBSC2*MB2 + 4*CosBSC2*MC2 - 2*CosBSC2*BC2 + 2*BC2 - 2*MB2 - 2*MC2 + 2*CosMSC4*BC2 - 2*CosMSC4*MB2 - 2*CosBSC4*MB2 - 2*CosBSC4*MC2 - 4*MB2*CosMSC2*CosBSC2 - 2*MC2*CosMSC2*CosBSC2 + 2*BC2*CosMSC2*CosBSC2;
//KMAC8 = CosMSA4 + CosMSC4 + CosASC4 - 4*CosMSA3*CosMSC*CosASC + 2*CosMSA2*CosMSC2 + 2*CosMSA2*CosASC2 + 4*CosMSA2*CosMSC2*CosASC2 - 4*CosMSA*CosMSC3*CosASC - 4*CosMSA*CosASC3*CosMSC + 4*CosMSA*CosMSC*CosASC - 2*CosMSA2 - 2*CosASC2 - 2*CosMSC2 + 2*CosMSC2*CosASC2 + 1;




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

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

Сообщение NAGIBATOR228pacan 31 мар 2019, 13:05

NOVA писал(а):Короче система решается биквадратными уравнениями. Получается 3 одинаково верных результата и три одинаково неверных и ещё 6 зеркальных но они не нужны. Как только перехожу на квадратные, double не тянет.
Дайте инфу по Decimal пожалуйста. Как объявлять и чем считать? А я пока поупрощаю косинусные произведения.

Скрытый текст:
K61 = KMBC6*KMAC8 - KMAC6*KMBC8;

KMBC6*KMAC8
//KMBC6 = CosMSB4*(2*BC2 - 2*MC2 - 4*CosMSC2*BC2) + CosMSB3*CosMSC*CosBSC*(8*CosMSC2*BC2 - 2*BC2 + 2*MB2 + 6*MC2) + CosMSB2*(8*CosMSC2*BC2 - 2*CosMSC2*MB2 - 2*CosMSC2*MC2 - 2*CosBSC2*MB2 + 2*CosBSC2*BC2 - 4*CosBSC2*MC2 - 4*CosMSC4*BC2 - 4*MB2*CosMSC2*CosBSC2 - 4*MC2*CosMSC2*CosBSC2 - 8*BC2*CosMSC2*CosBSC2 - 4*BC2 + 2*MB2 + 4*MC2) + CosMSB*CosMSC*CosBSC*(6*CosMSC2*MB2 - 2*CosMSC2*BC2 + 2*CosMSC2*MC2 + 6*CosBSC2*MB2 + 2*CosBSC2*BC2 + 6*CosBSC2*MC2 + 2*BC2 - 6*MB2 - 6*MC2) + 4*CosMSC2*MB2 - 4*CosMSC2*BC2 + 2*CosMSC2*MC2 + 4*CosBSC2*MB2 + 4*CosBSC2*MC2 - 2*CosBSC2*BC2 + 2*BC2 - 2*MB2 - 2*MC2 + 2*CosMSC4*BC2 - 2*CosMSC4*MB2 - 2*CosBSC4*MB2 - 2*CosBSC4*MC2 - 4*MB2*CosMSC2*CosBSC2 - 2*MC2*CosMSC2*CosBSC2 + 2*BC2*CosMSC2*CosBSC2;
//KMAC8 = CosMSA4 + CosMSC4 + CosASC4 - 4*CosMSA3*CosMSC*CosASC + 2*CosMSA2*CosMSC2 + 2*CosMSA2*CosASC2 + 4*CosMSA2*CosMSC2*CosASC2 - 4*CosMSA*CosMSC3*CosASC - 4*CosMSA*CosASC3*CosMSC + 4*CosMSA*CosMSC*CosASC - 2*CosMSA2 - 2*CosASC2 - 2*CosMSC2 + 2*CosMSC2*CosASC2 + 1;




Скрытый текст:
А ещё знакомый математик нужен. Премию Абеля проходимцам не дают. )))

Очень сомневаюсь что decimal тебе поможет, у него тоже ограниченная точность хоть и в несколько раз выше чем у обычного double, я думаю тебе стоит написать собственный класс своего вещественного числа который не будет зависеть от точности, как я говорил выше попробуй сделать представление вещественного числа в виде математической дроби и считай как в математике, которую переведешь в десятичную только в конце вычисления, таким образом у тебя не возникнет проблем с точностью в самом вычислении, правда придется писать куча функций для такой дроби для сложения, умножения, деления, сокращения и правда придется еще писать свою функцию косинуса. Ну я думаю за несколько дней ты бы смог спокойно справится. Хотя если ты упростишь ту многострочную дичь то возможно даже double справится
NAGIBATOR228pacan
UNITрон
 
Сообщения: 318
Зарегистрирован: 15 мар 2017, 20:39

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

Сообщение Saltant 31 мар 2019, 13:09

Ищи каких нибудь бородатых программистов лет по 50+ они шарят в этом.
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2234
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

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

Сообщение NOVA 31 мар 2019, 13:16

Saltant писал(а):Ищи каких нибудь бородатых программистов лет по 50+ они шарят в этом.

Они шарят в стандартном подходе.
Руководствуются кошмаром, похожим на этот.
http://imaging.cs.msu.su/pub/2007.JProg ... aft.ru.pdf
Либо такой вот дичью.
https://docplayer.ru/70095921-Gomografi ... -egor.html
Не могу смотреть на это без слёз. Прям гуманитарная олимпиада маразматиков.
Позовите господина Перельмана в тред. Ща разберёмся))
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

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

Сообщение NOVA 15 апр 2019, 20:56

Люди - человеки. Ну подскажите пожалуйста инфу по Decimal.
Задаются переменные decimal. Но считаться функцией Math не хотят.
К слову. Эта задача похожа на задачу Потенота (обратная геодезическая засечка).

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

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

Сообщение samana 15 апр 2019, 21:15

Кого-то это тоже расстроило и человек написал отдельный класс math для работы с decimal https://github.com/raminrahimzada/CShar ... malMath.cs
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

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

Сообщение NOVA 15 апр 2019, 21:20

samana писал(а):Кого-то это тоже расстроило и человек написал отдельный класс math для работы с decimal https://github.com/raminrahimzada/CShar ... malMath.cs

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

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

Сообщение samana 15 апр 2019, 21:46

А что, double тоже не хватало?
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Пред.След.

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

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

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