2014-10-07 3 views
-2

Я делаю калькулятор смешанных чисел для моего класса C++. Мы должны хранить все в специальном смешанном классе чисел с целым числом, числителем и знаменателем. Из-за этого иррациональные ответы должны быть аппроксимированы перед преобразованием в смешанные числа. Моя проблема в том, что если я построю результат 2^(1/2), он вернет смешанное число, которое действительно близко к 2, но не 2 точно. Я хочу знать, есть ли способ сделать (a^(1/n))^n возвращать a для всех положительных a. ТИА.квадратный корень C++

+5

Используете ли вы числа с плавающей запятой для представления данных? Если это так, то здесь происходит неточность. –

+2

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – IdeaHat

+1

@BrianCain Он прямо сказал, что использует рациональные числа. (Но, конечно, '2^(1/2)' не имеет точного решения по множеству рациональных чисел. Это его проблема.) –

ответ

2

Я предполагаю, что вы понимаете, что квадратный корень из двух не является рациональным числом. Следовательно, не существует двух целых чисел, коэффициент квадратов которых равен двум. У вас есть два основных варианта:

  1. Вы можете округлять все результаты, которые действительно действительно близки к целому числу с этим целым. В некоторых случаях это даст неправильный ответ. Но вы уже должны были признать, что вы не всегда можете дать точный ответ на все возможные проблемы, потому что вы представляете как рациональные некоторые цифры, которые не могут быть представлены именно таким образом.

  2. Вы можете добавить дополнительную информацию в дополнение к двум целым числам в представлении. Например, если что-то является результатом повышения целого числа до мощности, вы можете указать его как таковое. Если позже он будет повышен, вы можете использовать округление, как указано выше, или просто восстановить исходное целое число.

В принципе, решите, что вы хотите, и закодируйте его.

+0

У меня сложилось впечатление о возможности достижения этого, потому что многие из научных калькуляторов могут возвращать a для (a^(1/n))^n. Теперь я вижу, как они могут это сделать, используя флаги вместо другого механизма, о котором я не знал. Спасибо, что поняли меня. – giraid

0

Это было бы возможно для любого выражения, мы бы получили «автоматическую теорему».

Но, к сожалению, было доказано, что доказательство теоремы не является решением, разрешающим МТ.

Что вы можете сделать, это обеспечить некоторое символическое представление часто используется выражение (Обратите внимание, что рациональное число является символическим представлением a/b), например, для a^b, exp(a/b), log(a/b) и т.д., чем сочетание экспрессии и алгоритма для упрощения хорошо известных комбинаций.

Таким образом, 2^(2/2) будет 2 после упрощения выражения.

Результат будет довольно сложным кодом, не обязательно быстрым, который работает только для случаев, когда вы предоставили «решение». Но всегда есть способ написать выражение в запутанном виде, которого вы не предсказывали.

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

Смежные вопросы