|
Страници по тази тема: 1 | 2 | 3 | (покажи всички)
Тема
|
Странности със <
|
|
Автор |
naki (Power User) |
Публикувано | 19.12.07 22:58 |
|
Имаме следния код (на C#2005):
double b;
double D;
b=1.7;
D=10;
if (b/D<0.17)
MessageBox.Show("Sux!");
else
MessageBox.Show("Correct!");
Резултата е "Sux!", а би трябвало да е =.
Тоест трябва да е = (равно), а то го дава, че е < (по-малко).
Същото е и ако под VB2005.
Под VC++ 2005 още не съм пробвал.
При промяна на кода на
(b/D)*100<17
работи правилно.
Някакви идеи защо така става?
| |
Тема
|
Re: Странности със <
[re: naki]
|
|
Автор | Pжeвckи (Нерегистриран) |
Публикувано | 19.12.07 23:07 |
|
Щото плаващи пясъци/запетаи.
Туй стига ли като отговор?
| |
Тема
|
Re: Странности със <
[re: naki]
|
|
Автор | tux (Нерегистриран) |
Публикувано | 20.12.07 01:04 |
|
пробвай да напишеш 1.7 в двоична бройна система
| |
Тема
|
Re: Странности със <
[re: naki]
|
|
Автор | zaphod (Нерегистриран) |
Публикувано | 20.12.07 08:29 |
|
ехе, то ко беше да дава =, кода ми щеше да падне с поне 20%
| |
Тема
|
Re: Странности със <
[re: naki]
|
|
Автор | Гeнepaл Acaнcьop (Нерегистриран) |
Публикувано | 20.12.07 10:08 |
|
Малък си, и си нов в областта на двоичната репрезентация на десетични числа с плаваща запетая.
1.7/10.0 = 0.16999999999999998
| |
Тема
|
Re: Странности със <
[re: naki]
|
|
Автор |
Colombino (работен) |
Публикувано | 20.12.07 11:56 |
|
Вероятно си чувал, че floating point числа се сравняват за равенство с някакъв епсилон fabs//fabsf(a-b) < epsilon. Тва не е приумица.
10 може да ти изглежда кръгло число, ама е 2 * 5, а 5 никак не е кратно на 2 и в двоична бройна система деленето на 10 не е красиво. И понеже нито 7/10, нито 17/100 имат точно представяне в двоична бройна система се натрупват грешки. В случая литералното 0.17 е по-близо до истината от 1.7/10, което при интервенцията с деленето на 5 (1/10=(1/2)*1/5) е загубило някой значещ бит от мантисата и е станало по-малко.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
| |
|
Мдаа, ето какво дава дебъгера:
| |
|
Май, за да е точно представянето, то трябва да е безкрайно. Гадни са реалните числа, трудно е да гледаш дискретно на тях.
Те за това не се ползва == сравнение за плаващи аритметики.
| |
|
Не бих нарекъл real/float типовете от компютърната аритметика реални числа. Те очевидно са рационални, макар наистина ролята им е да приближават реалните.
>> Май, за да е точно представянето, то трябва да е безкрайно.
Напротив: за да е точно представянето, то трябва да е крайно.
Ако вземеш 1/3 и го запишеш в 10-тична бройна система, то е доста криво число. В троична бройна система това е хубаво кръгло крано число и с него се смята много удобно.
Но е факт, че някои рационални числа имат кофти представяне в някои позиционни бройни системи. (пример: както вече казах 1/3 в десетична)
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
| |
|
Аз говоря за реални числа или поне за това си мисля, друг въпрос, че няма как човек да знае за какво си мисля.
Иначе верно тука за рационални числа става дума, но и в този контекст 1/3 десетично се представя безкрайно, което си прав е криво. Нищо дробно не е хубаво, хубави са целите. Например: цяла баничка е по-добре от 1/3 баничка.
| |
|
Страници по тази тема: 1 | 2 | 3 | (покажи всички)
|
|
|