как задать точность округления в mathematica

#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]]]