Limiting decimal precision in calculations - decimal

I currently have a very large dataset in SPSS where some variables have up to 8 decimal places. I know how to change the options so that SPSS only displays variables to 2 decimal places in the data view and output. However, SPSS still applies the 8 decimal precision in all calculations. Is there a way to change the precision to 2 decimal places without having to manually change every case?

You'll have to round each of the variables. You can loop through them like this:
do repeat vr=var1 var2 var3 var4 var5.
compute vr=rnd(vr, 0.01).
end repeat.
If the variables are consecutive in the file you can use to like this:
do repeat vr=var1 to var5.
....

SPSS Statistics treats all numeric variables as double-precision floating point numbers, regardless of the display formats. Any computations (other than those in one older procedure, ALSCAL) are done in double precision, and you don't have any way to avoid that.
The solution that you've applied will not actually make any calculations use only two decimals of precision. You'll start from that point with numbers rounded to approximately what they would be to two decimals, but most of them probably aren't exactly expressable as double precision floating point numbers, so what you're actually using isn't what you're seeing.

Related

Does Rust f64/f32 round correctly?

After a recent discussion about mathematical rounding with my colleagues, we analyzed the rounding of different languages.
For example:
MATLAB: "Round half away from zero"
Python: "Round half to even"
I would not say the one is correct or the other isn't but whats bothers me is the combination of the writing in the Rust Book and what the documentation say about the round function.
The book 1:
Floating-point numbers are represented according to the IEEE-754 standard. The f32 type is a single-precision float, and f64 has double precision.
The documentation 2:
Returns the nearest integer to self. Round half-way cases away from 0.0.
My concern is that the standard rounding for IEEE-754 is "Round half to even".
Most collegues who I ask tend to use and learned mostly/only "Round half away from zero" and they where actually confused as I came up with different rounding strategies. Does the developer of rust decided because of that possible confusion against the IEEE standard?
The documentation you cite is for an explicit function, round.
IEEE-754 specifies the default rounding method for floating-point operations should be round-to-nearest, ties-to-even (with some embellishment for an unusual case). The rounding method specifies how to adjust (conceptually) the mathematical result of the function or operation to a number representable in the floating-point format. It does not apply to what functions functions calculate.
Functions like round, floor, and trunc exist to calculate a specific integer from the argument. The mathematical calculation they perform is to determine that integer. A rounding rule only applies in determining what floating-point result to return when the ideal mathematical result is not representable in the floating-point type.
E.g., sin(x) is defined to return a result computed as if:
The sine of x were determined exactly, with “infinite” precision.
That sine were then rounded to a number representable in the floating-point format according to the rounding method.
Similarly, round(x) can be thought of to be defined to return a result computed as if:
The nearest integer of x, rounding a half-way case away from zero, were determined exactly, with “infinite” precision.
That nearest integer were then rounded to a number representable in the floating-point format according to the rounding method.
However, because of the nature of the routine, that second step is never necessary: The nearest integer is always representable, so rounding never changes it. (Except, you could have abnormal floating-point formats with limited exponent range so that rounding up did yield an unrepresentable integer. For example, in a format with four-bit significands but an exponent range that limited numbers to less than 4, rounding 3.75 to the nearest integer would yield 4, but that is not representable, so +∞ would have to be returned. I cannot say I have ever seen this case explicitly addressed in a specification of the round function.)
Nobody has contradicted IEEE-754, which defines five different valid rounding methods.
The two methods relevant to this question are referred to as nearest roundings.
Round to nearest, ties to even – rounds to the nearest value; if the number falls midway, it is rounded to the nearest value with an even least significant digit.
Round to nearest, ties away from zero (or ties to away) – rounds to the nearest value; if the number falls midway, it is rounded to the nearest value above (for positive numbers) or below (for negative numbers).
Python takes the first approach and Rust takes the second. Neither is contradicting the IEEE-754 standard, which defines and allows for both.
The other three are things we would probably more colloquially refer to as truncation, i.e. always rounding down, or always rounding up, or always rounding toward zero.

Decimal places in annotations of forest plots generated with the metafor package

In a previous post about significant figures displayed in forest plots generated with the metafor package , option digits was suggested to specify the number of decimal places for tick mark labels of the x-axis and plot annotations.
Is it possible to specify a different number of decimal places for different parts of the annotation, i.e. 1 decimal for the weights, more than one decimals for the effect sizes, and, if so, how?
Not at the moment. But I think this is a useful feature (showing many digits on the weights is often not that useful, so being able to adjust the number of digits for the weights separately from what is used for the effect size estimates and the x-axis labels makes sense). I have just pushed an update to the development version of metafor that allows you to specify 3 values for digits, the first for the annotations, the second for the x-axis label, and the third for the weights. You can install the development version as described here:
https://github.com/wviechtb/metafor#installation

Excel formatting - Integers with decimal point and thousand separator

All the data that come from the source are integers:
345819404
1093
28495
The only "tool" I have at my hand is Excel-style formatting options to turn it into:
3,458,194.04
10.93
284.95
Basically I can't convert those using / 100. So far I have two different styles that give me both components but I can't merge them together.
#,##0 gives me thousand separator
#"."00 places the dot as a "fake" decimal point
How can I get this work together?

Trigonometric functions not always exact in Excel

I need to convert values between formats used by different applications, and one of the applications performs calculations in degrees, not radians.
Thus, the application always expects cos(90) to equal exactly 0.
But in Excel, there are rounding errors when I do cos(radians(90)).
How do I handle situations like this?

Why do Excel and Matlab give different results?

I have 352k values and I want to find the most frequent values from all of them.
Numbers are rounded to two decimal places.
I use the commands mode(a) in Matlab and mode(B1:B352000) in Excel, but the results are different.
Where did I make a mistake, or which one can I believe?
Thanks
//edit: When I use other commands like average, the results are the same.
From Wikipedia:
For a sample from a continuous distribution, such as [0.935..., 1.211..., 2.430..., 3.668..., 3.874...], the concept is unusable in its raw form, since no two values will be exactly the same, so each value will occur precisely once. In order to estimate the mode of the underlying distribution, the usual practice is to discretize the data by assigning frequency values to intervals of equal distance, as for making a histogram, effectively replacing the values by the midpoints of the intervals they are assigned to. The mode is then the value where the histogram reaches its peak. For small or middle-sized samples the outcome of this procedure is sensitive to the choice of interval width if chosen too narrow or too wide
Thus, it is likely that the two programs use a different interval size, yielding different answers. You can believe both (I presume) but knowing that the value returned is an approximation to the true mode of the undelying distribution.

Resources