Работа с ошибкой округления при записи RREF - PullRequest
1 голос
/ 02 ноября 2011

Я пытаюсь написать программу, которая решает для уменьшенного ряда строк при задании матрицы.По сути, я пишу программу, которая решает системы уравнений.Однако из-за того, что бывают случаи, когда мне нужно выполнить деление, чтобы получить повторяющиеся цифры (например, 2/3, то есть .66666 ...), а java округляется до определенной цифры, бывают моменты, когда точка разворотадолжно быть 0 (что означает отсутствие оси) это что-то вроде .0000001, и это портит всю мою программу.

Мой первый вопрос: если бы у меня было какое-то утверждение if, как лучше написать что-то вроде «если это число меньше чем .00001, а не целое число, то округляем до ближайшегоinteger ".

Мой второй вопрос: есть ли у кого-нибудь какие-либо идеи относительно более оптимальных способов решения этой ситуации, а не просто ставить ли операторы, округляющие числа повсюду.

Большое спасибо.

1 Ответ

0 голосов
/ 02 ноября 2011

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

Вы определили главную проблему: использование чисел с плавающей запятой приводит к округлению и, следовательно, к неточным результатам.Есть два решения для этого.

Первое решение - не использовать числа с плавающей запятой.Используйте только целые числа и приведите матрицу к строке в виде ряда (не сокращается);это можно сделать без делений.Поскольку все вычисления с целыми числами являются точными, точка, которая должна быть равна 0, будет точно равна 0 (на самом деле, может быть проблема с переполнением).Конечно, это будет работать, только если матрица, с которой вы начинаете, состоит из целых чисел.Вы можете обобщить этот подход, работая с дробями вместо целых чисел.

Второе решение - использовать числа с плавающей запятой и быть очень осторожным.Это тема целой отрасли математики / информатики, называемой численным анализом.Это слишком сложно объяснить в ответе здесь, поэтому вы должны получить книгу по числовому анализу.Проще говоря, вы хотите сказать, что если Math.abs (pivot) <небольшое значение, то вы предполагаете, что pivot должен быть равен нулю, но это что-то вроде .0000000001 из-за ошибок округления, поэтому выпросто ведите себя так, как будто точка опоры равна нулю.Проблема в том, чтобы выяснить, что такое «небольшая ценность».</p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...