1

Тема: Задача про порівняння Цілих в Java

import java.lang.*;
import java.util.*;
 
class Main
{
  public static void main (String[] args) throws java.lang.Exception
  {
     Integer a,b,c=100;
     while(c-->0)
     {
         a=c*(c+1)*(c+2)%10000/10;
         b=c*(c+1)*(c+2)%10000/10;
         if(a==b)
           System.out.println("yes!");
         else
           System.out.println("no...");
     }
  }
}

Легко переконатися (наприклад), що вивід цієї програми не однорідний, як можна було б очікувати. Хтось знає, чому?
П.С. Це саме задача, я відповідь знаю, тому прошу свої варіанти під спойлер.

Подякували: Replace, Chemist-i2

2 Востаннє редагувалося Chemist-i (29.06.2013 01:01:48)

Re: Задача про порівняння Цілих в Java

Прихований текст

Тому, що % - ділення націло, а в java є така неприємна штука при роботі з цифрами, це можна можна легко подивитись на такому коді:
[code=java]
int a = 1;
double b = 10;
double c = 0;

for (int i; i<10; i++)
{
  c = a/(b*i);
  вивід с;
}

[/code]

До речі, лінк: http://www.h-schmidt.net/FloatConverter/IEEE754.html

3 Востаннє редагувалося Replace (29.06.2013 01:11:33)

Re: Задача про порівняння Цілих в Java

Прихований текст

Кеш?

Прихований текст

Кеш для малих значень?

Прихований текст

Так...
Не витримав глянув в source :)

public static Integer valueOf(int i) {
         final int offset = 128;
         if (i >= -128 && i <= 127) { // must cache
             return IntegerCache.cache[i + offset];
         }
         return new Integer(i);
}

Дякую за задачку. Ще є? =)

Подякували: koala1

4

Re: Задача про порівняння Цілих в Java

Chemist-i написав:
Прихований текст

Тому, що % - ділення націло, а в java є така неприємна штука при роботі з цифрами, це можна можна легко подивитись на такому коді:
[code=java]
int a = 1;
double b = 10;
double c = 0;

for (int i; i<10; i++)
{
  c = a/(b*i);
  вивід с;
}

[/code]

До речі, лінк: http://www.h-schmidt.net/FloatConverter/IEEE754.html

Прихований текст

Хіба там є double?

5

Re: Задача про порівняння Цілих в Java

Replace написав:
Chemist-i написав:
Прихований текст

Тому, що % - ділення націло, а в java є така неприємна штука при роботі з цифрами, це можна можна легко подивитись на такому коді:
[code=java]
int a = 1;
double b = 10;
double c = 0;

for (int i; i<10; i++)
{
  c = a/(b*i);
  вивід с;
}

[/code]

До речі, лінк: http://www.h-schmidt.net/FloatConverter/IEEE754.html

Прихований текст

Хіба там є double?

Прихований текст

Нє, там нема, але воно ж округлює

6

Re: Задача про порівняння Цілих в Java

Chemist-i,

Прихований текст
a=c*(c+1)*(c+2)%10000/10;
b=c*(c+1)*(c+2)%10000/10;

Прихований текст

По різному округлює для a та b?  :)

7

Re: Задача про порівняння Цілих в Java

Replace написав:

Chemist-i,

Прихований текст

[code]a=c*(c+1)*(c+2)%10000/10;
b=c*(c+1)*(c+2)%10000/10;
[/code]


Прихований текст

По різному округлює для a та b?  :)

Прихований текст

О, я кажись зрозумів, якщо переробити прогу ось так, то має правильно працювати (соррі, не перевіряв, бо нічим)
[code=java]import java.lang.*;
import java.util.*;

class Main
{
  public static void main (String[] args) throws java.lang.Exception
  {
     int a,b,c=100; //int замість Integer
     while(c-->0)
     {
         a=c*(c+1)*(c+2)%10000/10;
         b=c*(c+1)*(c+2)%10000/10;
         if(a==b)
           System.out.println("yes!");
         else
           System.out.println("no...");
     }
  }
}[/code]

8

Re: Задача про порівняння Цілих в Java

Chemist-i,

Прихований текст

Так, але там ще цікавинка є...

вивід цієї програми не однорідний

Неоднорідний і весь час постійний :)

9 Востаннє редагувалося Chemist-i (29.06.2013 01:27:03)

Re: Задача про порівняння Цілих в Java

Прихований текст
Replace написав:

Неоднорідний і весь час постійний

Як це зрозуміти? http://ideone.com/JQRQZK

10 Востаннє редагувалося Replace (29.06.2013 01:33:08)

Re: Задача про порівняння Цілих в Java

Chemist-i,

Прихований текст

Я про інше. Чому з Integer постійний та неоднорідний результат.

Підказка:

import java.lang.*;
import java.util.*;
 
class Main
{
  public static void main (String[] args) throws java.lang.Exception
  {
     Integer a, b, c=200;
     while(c-->0)
     {
         a=c + 1;
         b=c + 1;
         System.out.println(a);
         System.out.println(b);
         if(a==b)
           System.out.println("yes!");
         else
           System.out.println("no...");
     }
  }
}

Результат:

java Main
200
200
no...
199
199
no...
198
198
no...
197
197
no...
196
196
no...
195
195
no...
194
194
no...
193
193
no...
192
192
no...
191
191
no...
190
190
no...
189
189
no...
188
188
no...
187
187
no...
186
186
no...
185
185
no...
184
184
no...
183
183
no...
182
182
no...
181
181
no...
180
180
no...
179
179
no...
178
178
no...
177
177
no...
176
176
no...
175
175
no...
174
174
no...
173
173
no...
172
172
no...
171
171
no...
170
170
no...
169
169
no...
168
168
no...
167
167
no...
166
166
no...
165
165
no...
164
164
no...
163
163
no...
162
162
no...
161
161
no...
160
160
no...
159
159
no...
158
158
no...
157
157
no...
156
156
no...
155
155
no...
154
154
no...
153
153
no...
152
152
no...
151
151
no...
150
150
no...
149
149
no...
148
148
no...
147
147
no...
146
146
no...
145
145
no...
144
144
no...
143
143
no...
142
142
no...
141
141
no...
140
140
no...
139
139
no...
138
138
no...
137
137
no...
136
136
no...
135
135
no...
134
134
no...
133
133
no...
132
132
no...
131
131
no...
130
130
no...
129
129
no...
128
128
no...
127
127
yes!
126
126
yes!
125
125
yes!
124
124
yes!
123
123
yes!
122
122
yes!
121
121
yes!
120
120
yes!
119
119
yes!
118
118
yes!
117
117
yes!
116
116
yes!
115
115
yes!
114
114
yes!
113
113
yes!
112
112
yes!
111
111
yes!
110
110
yes!
109
109
yes!
108
108
yes!
107
107
yes!
106
106
yes!
105
105
yes!
104
104
yes!
103
103
yes!
102
102
yes!
101
101
yes!
100
100
yes!
99
99
yes!
98
98
yes!
97
97
yes!
96
96
yes!
95
95
yes!
94
94
yes!
93
93
yes!
92
92
yes!
91
91
yes!
90
90
yes!
89
89
yes!
88
88
yes!
87
87
yes!
86
86
yes!
85
85
yes!
84
84
yes!
83
83
yes!
82
82
yes!
81
81
yes!
80
80
yes!
79
79
yes!
78
78
yes!
77
77
yes!
76
76
yes!
75
75
yes!
74
74
yes!
73
73
yes!
72
72
yes!
71
71
yes!
70
70
yes!
69
69
yes!
68
68
yes!
67
67
yes!
66
66
yes!
65
65
yes!
64
64
yes!
63
63
yes!
62
62
yes!
61
61
yes!
60
60
yes!
59
59
yes!
58
58
yes!
57
57
yes!
56
56
yes!
55
55
yes!
54
54
yes!
53
53
yes!
52
52
yes!
51
51
yes!
50
50
yes!
49
49
yes!
48
48
yes!
47
47
yes!
46
46
yes!
45
45
yes!
44
44
yes!
43
43
yes!
42
42
yes!
41
41
yes!
40
40
yes!
39
39
yes!
38
38
yes!
37
37
yes!
36
36
yes!
35
35
yes!
34
34
yes!
33
33
yes!
32
32
yes!
31
31
yes!
30
30
yes!
29
29
yes!
28
28
yes!
27
27
yes!
26
26
yes!
25
25
yes!
24
24
yes!
23
23
yes!
22
22
yes!
21
21
yes!
20
20
yes!
19
19
yes!
18
18
yes!
17
17
yes!
16
16
yes!
15
15
yes!
14
14
yes!
13
13
yes!
12
12
yes!
11
11
yes!
10
10
yes!
9
9
yes!
8
8
yes!
7
7
yes!
6
6
yes!
5
5
yes!
4
4
yes!
3
3
yes!
2
2
yes!
1
1
yes!

11

Re: Задача про порівняння Цілих в Java

Прихований текст

Replace
Тому, що Integer с - це посилання на об_єкт int, так? А ми вже домовились =) у іншій темі, що порівнювати посилання - це порівнювати їх адреси.

12

Re: Задача про порівняння Цілих в Java

Прихований текст
Chemist-i написав:
Прихований текст

Replace
Тому, що Integer с - це посилання на об_єкт int, так? А ми вже домовились =) у іншій темі, що порівнювати посилання - це порівнювати їх адреси.

Але чому від 0 до 128 - yes, а після no? :)

13

Re: Задача про порівняння Цілих в Java

Прихований текст
Replace написав:
Chemist-i написав:
Прихований текст

Replace
Тому, що Integer с - це посилання на об_єкт int, так? А ми вже домовились =) у іншій темі, що порівнювати посилання - це порівнювати їх адреси.

Але чому від 0 до 128 - yes, а після no? :)

Таки кеш, докопався таки до істини - http://tech-read.com/2010/02/03/integercache-in-jdk1-5/

Подякували: Replace, koala2

14

Re: Задача про порівняння Цілих в Java

Replace написав:

Кеш?

Так, все правильно.

Replace написав:

Дякую за задачку. Ще є? =)

Ні, поки що. Java я в цілому не знаю - ну як, набидлокодити щось можу, але мова чомусь викликає у мене відразу. Це так, просто пригадалося зі студентських часів.

Подякували: Chemist-i1

15

Re: Задача про порівняння Цілих в Java

Прихований текст

Від 0 до 127 рівність спрацьовує, а для інших значень - ні

16

Re: Задача про порівняння Цілих в Java

msk написав:
Прихований текст

Від 0 до 127 рівність спрацьовує, а для інших значень - ні

1. Це не відповідь на питання.
2. Це твердження хибне.

Подякували: Replace1