#wolfram-mathematica
#wolfram-mathematica
Вопрос:
Я хочу проиллюстрировать стабильность некоторых числовых алгоритмов. Я хочу использовать Mathematica для округления чисел с плавающей запятой в соответствии с обычным правилом, например:
myRound[3/80.]=0.038
если я укажу точность, которая будет 2-значной.
Еще один
myRound[89/47.]=1.89
Итак, учитывая число с точностью, как написать myRound
функцию? Пожалуйста, помогите. Большое спасибо.
Комментарии:
1. Вы, конечно, знаете, что
Round
это встроенная функция с несколько иным значением, верно? Не предпочли бы вы присвоить своей функции другое имя?2. @Дэвид, правильно. Просто забыл отличить мою собственную версию
Round
.
Ответ №1:
Вам следует изучить NumberForm
. Например:
NumberForm[89.0/47.0, 3]
Возвращает 1.89.
На самом деле, мне приходит в голову, что если вы действительно хотите проиллюстрировать проблемы округления, вам следует заглянуть в ComputerArithmetic
пакет. Это хорошо документировано, поэтому я оставлю все как есть.
Комментарии:
1. но это не работает для первого примера. В моем Mma я получил 0.0375 за это. В идеале я хочу использовать представление чисел с плавающей запятой.
2. @Qiang — Попробуй,
NumberForm[3/80., {3, 3}]
.3. кроме того, таким образом, числа больше не работают. Я бы хотел, чтобы все арифметические операции производили округленные числа, а не просто показывали мне какую-то специальную форму, но внутреннее представление по-прежнему оставалось с полной точностью. Можно ли это сделать?
4. @Qiang — Правильно. Как и большинство
*Form
функций,NumberForm
является оболочкой, которая влияет на отображение, но не на содержимое.SetAccuracy
может сработать для вас, но я подозреваю, что введение произвольной точности в ваши вычисления может быть проблематичным.5. @Qiang — Смотрите дополнение
ComputerArithmetic
.
Ответ №2:
Я не уверен, что это то, чего вы хотели бы:
In[34]:= customRound[x_Real] :=
Round[x, 10^Round[RealExponent[x]]*0.01]
In[35]:= customRound[3/80.]
Out[35]= 0.038
In[36]:= customRound[89/47.]
Функция фактически изменяет число, в отличие от простого изменения способа его отображения.
Комментарии:
1. да, это то, что я хочу! Однако, есть ли какой-либо простой способ изменить все функции, такие как Add, Subtract, Times, Exp и т.д., Чтобы всякий раз, когда они видели действительные числа, они выполняли арифметику в соответствии с этим правилом округления?
2. @QiangLi Да, но это может иметь непреднамеренные последствия, поэтому используйте это на свой страх и риск. Установить
$Post = Function[Replace[#, x_Real :>customRound[x]]]