The Big Programming Thread - Page 845
Forum Index > General Forum |
Thread Rules 1. This is not a "do my homework for me" thread. If you have specific questions, ask, but don't post an assignment or homework problem and expect an exact solution. 2. No recruiting for your cockamamie projects (you won't replace facebook with 3 dudes you found on the internet and $20) 3. If you can't articulate why a language is bad, don't start slinging shit about it. Just remember that nothing is worse than making CSS IE6 compatible. 4. Use [code] tags to format code blocks. | ||
Hanh
146 Posts
| ||
Acrofales
Spain17834 Posts
On February 15 2017 22:16 Manit0u wrote:
It's astounding how seemingly identical code (same logic basically) can impact performance:
I should definitely test if other interpreted languages behave in this way. If so, guard clauses all the way! I'm not quite sure how to interpret your benchmark results, but if I am supposed to look at what it computes as "real" time in the actual test, it seems like a completely negligible difference. There's a lot of statistics missing. If that ran once, it doesn't show anything. If it was run lots of times, you'd espect a mean and a std. dev... and preferrably a t-test. Finally, I don't know enough about low-level architecture, but how accurate is the computer clock? Because it's claiming microsecond accuracy, and unless you have specialized time measuring equipment in your system, I doubt the clock is accurate to that degree, which means you'd need to cut off a whole load of those trailing digits due to insignificance. | ||
Manit0u
Poland17187 Posts
The difference in cpu time, system call time and real time doesn't seem like much, but the test was the most basic thing I could think of. I'll write a proper test later on. The thing is, that supposedly with guard clauses the interpreter doesn't have to parse so much, and it should work faster. To test it properly I'll write a bit more elaborate functions, with guards and regular, both hitting the guard and not. Edit: Results with fibonacci 42 and 1
0.2s is not insignificant, even though it's still simple. Any idea how I could test it better? Should I add more of the branching logic, exceptions etc? I'm genuinely interested in this peculiarity. Also: https://github.com/search?utf8=✓&q=remove password&type=Commits&ref=searchresults | ||
Hanh
146 Posts
| ||
Silvanel
Poland4692 Posts
my code + Show Spoiler +
output i am getting + Show Spoiler +
So basically i created a loop longer than array i am iterating over. Where does the values after the array ends come from? Is C assigning them at random? I suppose lesson is - be aware C is weird. | ||
Acrofales
Spain17834 Posts
On February 16 2017 00:19 Silvanel wrote: So i was playing with arrays in C. And i just encountered something i am not sure i understand. What is happening? my code + Show Spoiler +
output i am getting + Show Spoiler +
So basically i created a loop longer than array i am iterating over. Where does the values after the array ends come from? Is C assigning them at random? I suppose lesson is - be aware C is weird. Not so much that C is weird, but that C is unsafe. C won't throw pretty "array index out of bounds" exception thingies. It'll simply see whether it can turn whatever it finds at the pointer address into the correct type. For more complex types, that is usually no, but for ints, it is almost always yes... and thus it won't segfault out, but interpret what it finds as an int and continue. Then 100 lines of code further it will try to divide by 0 and segfault, or it will just give random gibberish as output. | ||
slmw
Finland233 Posts
| ||
Blisse
Canada3710 Posts
On February 16 2017 00:19 Silvanel wrote: So i was playing with arrays in C. And i just encountered something i am not sure i understand. What is happening? my code + Show Spoiler +
output i am getting + Show Spoiler +
So basically i created a loop longer than array i am iterating over. Where does the values after the array ends come from? Is C assigning them at random? I suppose lesson is - be aware C is weird. As everyone has said, in C, `arrayPointer[i]` is equivalent to `*(arrayPointer + i)`. If you declared an array with 4 elements `int array[4];` and called `array[100]` you'd actually access the value by `*(array + 100)`. A fun result is that you should also be able to do `100[array]`. Also potentially helpful in understanding. http://c-faq.com/aryptr/aryptr2.html | ||
![]()
tofucake
Hyrule18969 Posts
| ||
Blisse
Canada3710 Posts
On February 15 2017 01:52 TheEmulator wrote: My cousin is in grade 12 and he's thinking of majoring in CS when he goes to uni. He knows I've taken a few classes and have been doing self learning over the past year so he asked me some questions, one of which was "what's a good online course I can take to get a head start". I am thinking of recommending the intro to programming on Udacity as well as Harvard's CS50x since he wants more of an actual structured class. Any other options? Has anyone taken either of those, and would you recommend them? The most stimulating thing I found with programming when I was younger was solving problems from coding competitions, which generally involved more extracting logical requirements from written problems and translating them into mostly straightforward code. I had much more of a math background pre-university which made those ideas comfortable. There are a lot of high school coding competitions and more importantly practice problems that may be more relevant, if he has any programming experience. Computer Science is such a hot commodity now though so hopefully he's not starting from scratch by himself otherwise it'll likely be much more difficult getting into university for CS. | ||
mantequilla
Turkey775 Posts
On February 16 2017 04:40 Blisse wrote: As everyone has said, in C, `arrayPointer[i]` is equivalent to `*(arrayPointer + i)`. If you declared an array with 4 elements `int array[4];` and called `array[100]` you'd actually access the value by `*(array + 100)`. A fun result is that you should also be able to do `100[array]`. Also potentially helpful in understanding. http://c-faq.com/aryptr/aryptr2.html when do you start accessing other programs' data on memory? | ||
Nesserev
Belgium2760 Posts
| ||
Blisse
Canada3710 Posts
On February 16 2017 07:03 mantequilla wrote: when do you start accessing other programs' data on memory? What do you mean by "when"? Generally there is an OS-level monitor in place that detects when you access memory your process doesn't have access to, and then generally there may be OS-level provisions to resolve that. | ||
Acrofales
Spain17834 Posts
On February 16 2017 07:49 Blisse wrote: What do you mean by "when"? Generally there is an OS-level monitor in place that detects when you access memory your process doesn't have access to, and then generally there may be OS-level provisions to resolve that. But way back when in DOS days the OS didn't have the safeguards they do today, you could do whatever you wanted with memory... and that's why my father forbade me from ever using peeks and pokes in my BASIC programs. | ||
Deleted User 3420
24492 Posts
So let's say our domain is.. reals reflexive means that if we pick a relation ( <, R x R), we are looking for it to be true for every n that (n, n) fits the relationship so we are looking for an "n" in the reals where n is less than n. so this is not reflexive because this is not always (never, in this case) true but if we pick ( =, R x R), then we are looking for n = n, which is the case so this is reflexive ? symmetric means that for every (n1, n2) in the relationship, then (n2, n1) also exists in the relationship? so in the reals , a relationship of ( <, RxR) would be false, since 1 < 2 but 2 !< 1 however, a relationship of ( (n1 * n2 < 10) , RxR ) would be true, since 1 * 2 < 10, and 2 * 1 < 10 (and it holds true for every n1, n2) transitive means that given an n1, n2, n3 in our relation: (n1, n2) and (n2, n3) in the relation means (n1, n3) is in the relation so an example that holds false would be uh... say... (( n1 * n2 = 0), RxR), (( n2 * n3 = 0), RxR) because 1 * 0 = 0 , 0 * 5 = 0 , but 1 * 5 = 5 but an example that holds true would be that (n1 < n2, RxR), (n2 < n3, RxR). because if 1 < 2, and 2 < 3, then 1 is less than 3 is my understanding with these all correct? this stuff is getting kinda of tough tbh my class is covering SO MUCH material another question is 0 congruent to 0 (mod n) where n is any integer ? no, right? the remainder is n? edit: looks like wolfram alpha is saying that it IS congruent. I don't understand why the remainder is 0 but okay ![]() a weird question: is it false to say that 10 is congruent to 5 (mod 5) ? | ||
Hanh
146 Posts
2. Congruence modulo N is an example of such relation. By definition, a is congruent to b if and only if there is a p in Z such as a = b + pN. You can prove it is reflexive, symetric and transitive. - reflexive: a = a + 0xN - symetric: a = b + pN <=> b = a - pN - transitive: a = b + pN and b = c + qN => a = c + (p+q)N Trivially, from the reflexive property. 0 = 0 (n) and 10 = 5 (5) because 10 = 5 + 1x5 If it helps, remember than we use congruence mod 12 all the 'time' (pun intended). 5 am and 5 pm are congruent mod 12. Another way to see congruence is: a = b (n) if and only if a-b is a multiple of n (zero and negative multiples are allowed) so 10-5 = 5 which is a multiple of 5 obviously. From a more high level point of view, your class covers a lot of material quickly because many of the properties of continuous sets do not apply and it has to introduce what is available. After that, you will hardly ever deal with relations anymore. It will be implied by the context. Yet, it is important to know what you can and cannot do. | ||
Deleted User 3420
24492 Posts
http://aleph.math.louisville.edu/teaching/2011SP-311/notes-110209.pdf The 3 propositions I understand proposition 1, but #2 and 3 makes no sense to me like, the actual proof makes sense, but in practice, let's take a = 100, b = 2, n = 7 100 is congruent 2 (mod 7) this is true. and based on their proof, 7 does divide (100-2) but 2 is congruent 100 (mod 7) this is not true. based on their proof, 7 does divide (2-100), but I don't understand how I am using modular arithmetic incorrectly then is it that I am actually applying it incorrectly and that the correct way to apply it is not to divide a by n and look for remainder b, but rather to always subtract b from a and then see if the result is divisible by n? edit: (it looks like you provided the same proofs above) | ||
Hanh
146 Posts
| ||
Blisse
Canada3710 Posts
On February 17 2017 10:31 travis wrote: Hanh, I need help understanding these scenarios. I believe I already have the answers via proofs, but I don't understand the proofs. I've been trying to understand it but I don't. http://aleph.math.louisville.edu/teaching/2011SP-311/notes-110209.pdf The 3 propositions I understand proposition 1, but #2 and 3 makes no sense to me like, the actual proof makes sense, but in practice, let's take a = 100, b = 2, n = 7 100 is congruent 2 (mod 7) this is true. and based on their proof, 7 does divide (100-2) but 2 is congruent 100 (mod 7) this is not true. based on their proof, 7 does divide (2-100), but I don't understand how I am using modular arithmetic incorrectly then is it that I am actually applying it incorrectly and that the correct way to apply it is not to divide a by n and look for remainder b, but rather to always subtract b from a and then see if the result is divisible by n? edit: (it looks like you provided the same proofs above) 2 is congruent to 100 mod 7 iff 7 | 2 - 100 7 | 2 - 100 7 | -98 7 | -98 iff exists n such that 7*n = -98 n=-14, thus 7 | -98 therefore 2 is congruent to 100 mod 7 conceptually it helps the first time to think about congruency as x dividing n with remainder r, but think of how it'd work for different numbers is -12 congruent to 100 mod 7? via your original non-definition method you'd go -12 / 7 = 1 remainder -5 100 / 7 = 14 remainder 2 -5 is not equal to 2, but -5 + 7 is 2, so that looks good what's with the random steps why do we compare to 2 here, instead of say, 16, because -12 is also congruent to 16 mod 7. is there something special about remainder 2? why do we care that it's the smallest positive congruent integer? versus formally and to the point, -12 congruent to 100 mod 7 iff 7 | -12 - 100 7 | -12 - 100 7 | -112 7 | -112 iff exists n such that 7*n = -112 n=-16, thus 7 | -112 therefore -12 is congruent to 100 mod 7 the classes move quickly because these definitions aren't the meat of the class, but they're foundational to working with the theorems later on. they should also be relatively straightforward, just following formulas and definitions. the later theorems are much more about developing intuition on how people arrived at the theorem. | ||
![]()
tofucake
Hyrule18969 Posts
a = 100, b = 2, n = 7 a - b is 100 - 2 = 98, which is 7*14 The way you did it also works but isn't congruent because of a negative result | ||
| ||