Please tell me if this simplified function does what you want:
f[x_, n_] := Round[x, 10^(1 - n + ⌊ Log10 @ Abs @ x ⌋)] ~SetPrecision~ n
Test:
Table[f[x*Pi, 4], {x, {1/100, 1/10, 1, 10, 100}}]
% // FullForm
{0.03142, 0.3142, 3.142, 31.42, 314.2} List[0.03142`4., 0.3142`4., 3.142`4., 31.42`4., 314.2`4.]
Update
The OP wrote:
I understand that there is a difference in the 'implied precision' between the number
0.5
and1/2
when entered in Mathematica. But my request is to perform a very simple calculation: consider the number1.004
and double it. The answer is2.008
. Then round it to 3 sig. fig, the answer is 2.01. Take that number, divide it by two/multiply by half/multiply by 0.5 (mathematically equivalent). The mathematical answer is 1.005. I did not ask to round the final answer to 3 sig. fig. as that could be done by doingf
to the final answer. Is this possible?
I suspect that I am failing to comprehend the needs that are behind this request and as such that my recommendations may be inadequate or inappropriate. However I am trying both to understand and to help, so I shall venture forward.
When performing the following operations:
1.004*2
f[%, 3]
x = %/2
2.008 2.01 1.01
The result is as desired except in the output formatting; the underlying value of x
is correct as can be seen with FullForm
:
FullForm[x]
1.005`3.
Increasing its precision also results in all four digits being formatted in output:
SetPrecision[x, 4]
1.005
If this is not an acceptable method then perhaps setting a higher precision beforehand would be usable.
1.004*2
f[%, 3]
f[%, 4]
%/2
2.008 2.01 2.010 1.005
If this too is not acceptable then to the best of my knowledge Mathematica has no floating point format that is, as you seem to want a fundamentally different precision arithmetic than what is implemented in Mathematica.
Perhaps working with Rational values could work for you. As a rough and partial example:
SetAttributes[num, NHoldAll]
num /: num[x_] * (num[y_] | y_.) := num[x * y]
num /: num[x_] + (num[y_] | y_.) := num[x + y]
Format[num[x_]] := N[x]
g[num[x_] | x_, n_] := num @ Round[x, 10^(1 - n + ⌊Log10@Abs@x⌋)]
Now:
g[1.00412, 4] (* step to show that g may be used more than once *)
%*2
g[%, 3]
%/2
1.004 2.008 2.01 1.005
Related Q&A's: