Why my solution doesn’t produce correct output when I = 2? | Sololearn: Learn to code for FREE!
New course! Every coder should learn Generative AI!
Try a free lesson
+ 4

Why my solution doesn’t produce correct output when I = 2?

It should work since the if statement is working for I = 1 and 2. Problem: https://www.urionlinejudge.com.br/judge/en/problems/view/1098 https://code.sololearn.com/ca22A08A9a21/?ref=app

3rd Aug 2021, 12:01 PM
Samia Haque
Samia Haque - avatar
17 Answers
+ 9
Alpha Caspian Because decimal is not precise in programming. A famous example is 0.1+0.2 != 0.3. It's not only in C++, but basically every languages which have the same decimal system. Though float can correctly hold up to 7 decimals, doing calculation with it may produce an approximate or an accurate value. We can't tell which it will be unless output it. Same things happen to double. By doing printf("%.7f", I), you can see that there is a 2 at the 7th decimal. I guess it's it so 2.0000002 != 2. That being said, I don't know why in C++ it doesn't output 2.0000002 unless you explicitly set the precision. If you want, you can use if(I==0 || I==1 || I==2.0000002f). I tested it and it works.
3rd Aug 2021, 1:03 PM
你知道規則,我也是
你知道規則,我也是 - avatar
+ 4
Because this is C++, you can use cout and let it omit the zero decimals output for you. Remove the if and else statements and add cout << "I=" << I << " J=" << I+J << "\n";
3rd Aug 2021, 12:21 PM
你知道規則,我也是
你知道規則,我也是 - avatar
+ 3
Alpha Caspian f tells the compiler to treat 2.0000002 as float, without it, the number would be treated as double and the variable I will implicitly convert to double temporarily when compare to equality. Basically, it won't go well because float can only hold up to 7 decimals, while double is more precise and stores up to 15 decimals. The further decimal won't be zeros but a bunch of inaccurate numbers stored in the float. There are also L and LL which can be placed after int, indicating long and long long respectively.
4th Aug 2021, 3:27 AM
你知道規則,我也是
你知道規則,我也是 - avatar
+ 3
Alpha Caspian I don't know, but you can check out the way C++ and most languages store decimal: https://en.m.wikipedia.org/wiki/IEEE_754#Basic_and_interchange_formats It's worth to check out, but honestly there isn't a practical use from knowing it in programming as you still cannot prevent the inaccuracy.
5th Aug 2021, 2:41 AM
你知道規則,我也是
你知道規則,我也是 - avatar
+ 2
.0f part makes it to output decimals
3rd Aug 2021, 12:56 PM
Aleksei Radchenkov
Aleksei Radchenkov - avatar
+ 1
I see. Thank you so much CarrieForle.
4th Aug 2021, 3:52 AM
Samia Haque
Samia Haque - avatar
0
CarrieForle I got your point but it should work for printf also with this code. But why it isn’t working for 2? I don't get it.
3rd Aug 2021, 12:29 PM
Samia Haque
Samia Haque - avatar
0
Alpha Caspian, it does work for I = 2 it outputs 3.0 , 4.0 and 5.0
3rd Aug 2021, 12:35 PM
Aleksei Radchenkov
Aleksei Radchenkov - avatar
0
Aleksei Radchenkov Though it gives the right output but It's not matching the problem requirements here. You it says For I=2 j should be 3, 4,5 not 3.0, 4.0 5.0. That means no zero decimals
3rd Aug 2021, 12:42 PM
Samia Haque
Samia Haque - avatar
0
I is indeed different from 2, it's 2.0000002384... Everytime you add 0.2 you're introducing in your result a bit of noise Doing it 5 times is still fine, but 10 times is enough for the error to become noticeable
3rd Aug 2021, 12:48 PM
Angelo
Angelo - avatar
0
Alpha Caspian, but that's what you did by printf("I=%.0f J=%.0f\n", I,J+I); which adds 0.0 to output....
3rd Aug 2021, 12:56 PM
Aleksei Radchenkov
Aleksei Radchenkov - avatar
0
But .0f means it will Just print without 0decimals.
3rd Aug 2021, 1:03 PM
Samia Haque
Samia Haque - avatar
0
Thanks CarrieForle I got your point now.
3rd Aug 2021, 1:10 PM
Samia Haque
Samia Haque - avatar
0
CarrieForle in the condition u used I==2.0000002f. Is it necessary to put f in last decimay place? Why?
3rd Aug 2021, 7:11 PM
Samia Haque
Samia Haque - avatar
0
CarrieForle sorry to bother you again. Another question poped on my head. Why the value is increasing in this manner? Like before 2.0000002 it was 1.8000001. I mean at 7th decimal it's increasing. Why?
4th Aug 2021, 6:14 PM
Samia Haque
Samia Haque - avatar
0
Ok CarrieForle Again Thanks a bunch.
5th Aug 2021, 8:06 AM
Samia Haque
Samia Haque - avatar
- 2
It's worth to check out, but honestly there isn't a practical use from knowing it in programming as you still cannot prevent the inaccuracy.
5th Aug 2021, 7:49 AM
Kevin Kogo
Kevin Kogo - avatar