Hartja Posted March 31, 2016 Posted March 31, 2016 I understand For loops and all of their components, but I was wondering if anyone has a trick to solve the end result? My wording is probably confusing so let me type out an example-(I apologize if there is a format error, I am new here) double x = 0; for (double i = 32; i < 36; i += 0.25) x += i % 32; out.println(x); I am on the computer science team at my school and I have trouble with these types of problems. I can just hand write it step by step but that takes way too long, does anyone know of a way to quickly solve it without a computer? Thank you.
EdEarl Posted March 31, 2016 Posted March 31, 2016 Does it depend on rounding error? If it does, there is no way to figure it out in your head. You must know how double is represented on the computer to know whether there is rounding error. If not, the final value of i is easy to deduce.
Robittybob1 Posted March 31, 2016 Posted March 31, 2016 I understand For loops and all of their components, but I was wondering if anyone has a trick to solve the end result? My wording is probably confusing so let me type out an example-(I apologize if there is a format error, I am new here) double x = 0; for (double i = 32; i < 36; i += 0.25) x += i % 32; out.println(x); I am on the computer science team at my school and I have trouble with these types of problems. I can just hand write it step by step but that takes way too long, does anyone know of a way to quickly solve it without a computer? Thank you. What computer language is that?
Sensei Posted March 31, 2016 Posted March 31, 2016 What computer language is that? Java has System.out.println() function. https://docs.oracle.com/javase/tutorial/essential/io/formatting.html But it does not matter in this subject. In C/C++ you would just replace that line with printf() or cout.
Endy0816 Posted March 31, 2016 Posted March 31, 2016 Depends on the number of iterations and what the loop is doing.
EdEarl Posted April 1, 2016 Posted April 1, 2016 (edited) 36-32=4 4/0.25 = about 16 iterations, depending on whether there is rounding. The final value of i is either 36 or about 36.24. The question seems intended to show whether a person understands the type double. Edited April 1, 2016 by EdEarl
Endy0816 Posted April 1, 2016 Posted April 1, 2016 (edited) This is what I got if anyone feels like taking a look: 32.0 -i- 0.0 -x- 1 -added for iteration count: n++ - 32.25 0.25 2 32.5 0.75 3 32.75 1.5 4 33.0 2.5 5 33.25 3.75 6 33.5 5.25 7 33.75 7.0 8 34.0 9.0 9 34.25 11.25 10 34.5 13.75 11 34.75 16.5 12 35.0 19.5 13 35.25 22.75 14 35.5 26.25 15 35.75 30.0 16 I do think you are probable right about the original question testing knowledge. I think OP is asking if there is any way to skip ahead for the final x value though. Not sure on that one and whether the solution would be generally applicable. Late and my engine is rapidly running out of steam here. Enjoy. Edited April 1, 2016 by Endy0816
Strange Posted April 1, 2016 Posted April 1, 2016 I do think you are probable right about the original question testing knowledge. Or (if it were an interview question) testing how the person thinks about the problem. Getting the "right" answer might not matter but I might give more consideration to someone who made points about representations of floating point numbers and attempted an analytical solution like EdEarl's.
Endy0816 Posted April 1, 2016 Posted April 1, 2016 Instructors like to have students find the result by hand when their students first start working with loops. I'm guessing op is just trying to find shortcuts. 32 + (15 * 0.25) is easy enough to figure out, but am not sure if the summation needed to find for x can be simplified.
EdEarl Posted April 1, 2016 Posted April 1, 2016 Values 1/2, 1/4, 1/8, ... 1/2n do not cause rounding errors in floating point types such a double, for small values of n. 1
Enthalpy Posted April 9, 2016 Posted April 9, 2016 Integer values and 1/2n don't BUT the compiler is often inaccurate when converting "0.25" because this is written in radix-10 and 5 dos not divide the powers of 2. So the double representation of "0.25" may well differ a little bit and end with 111111..., which suffices to foil the "i<36" test. I'm surprized by the "i % 32" that apparently returns 1 everytime. It should have worked among doubles according to http://mindprod.com/jgloss/modulus.html but what happens in Java during the type conversion? 32 is some sort of int. This program is a collection of what shouldn't be done.
EdEarl Posted April 9, 2016 Posted April 9, 2016 I'd expect compiler writers to diligently assure best accuracy. Of course no one is perfect, which is why standard languages have formal extensive test suites. I believe the standards or test suite would specify accuracy. See Test Suites
Enthalpy Posted April 11, 2016 Posted April 11, 2016 I know by experience that the best compilers convert decimal constants like 0.25 approximately in binary floats. This isn't even a mistake from them: they're within the granted tolerance. The programmers have to know it, not the compilers. It comes from 0.1 having no exact representation in binary, because 5 doesn't divide 2. Just like 1/3 has no exact representation in radix 10: it's 0.333 approximately, and it remains approximate however many places you take. Then, if you multiply by 3, you get 0.999 and not 1. If your arithmetic computes to three decimal places, the result is correct within the accepted tolerance, and it's the programmer's duty to live with that. Now, a compiler that reads the constant zero dot two five is likely to Load 5 (as a binary doublefloat) Multiply by 0.1 <= This is already inaccurate because 0.1 has no exact representation Add 2 Multiply by 0.1 <= Again a source of inaccuracy Dividing by 10 would improve nothing because all the binary machines I know make doublefloat divisions by first computing a reciprocal and then a multiplication. A compiler can't neither recognize all constants that have an exact representation as binary doublefloat because there are too many. The result is approximative as a consequence. It is allowed to by approximative. And I have observed it. It fully explains the loop's behaviour here. What seems to work up to now is that integer constants are well represented by doublefloats in javascript. ---------- Can someone tell us how Java converts the datatypes when asked to perform that? double % litteral_int To my opinion, something fails there too.
EdEarl Posted April 12, 2016 Posted April 12, 2016 It think IEEE 794 is the standard you want. IDK where to buy a copy.
Enthalpy Posted April 22, 2016 Posted April 22, 2016 The Ieee 754 is widely available and described. Unfortunately, the problem is not the binary representation of 0.25, which is exact, but the conversion from the string "0.25" to a binary float, which is allowed to be inaccurate within the tolerance, is expected to be inaccurate because of the conversion algorithm, and which I observed to be inaccurate in Javascript. ---------- Can someone tell what goes wrong with the other line? i % 32 And first, how does Java behave with the double float and the int?
DevilSolution Posted May 8, 2016 Posted May 8, 2016 Undefined ... the modulo operator gives an int, the regression from a double to int can be system specific i think. using a bit field and quotient should indicate the implementation. long double promption, double promotion, float promotion etc, always losing precision. Its relative to your system, each type has specified memory allocated (as in 32it float) as for an algraic formula im at a loss, if you wanted to estimate the iterations then using compound interest formula with the modulo 32.25 ^ x might be some help.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now