Автор Тема: Java и загуба на точност при сумиране на float  (Прочетена 2887 пъти)

c111100101

  • Гост
Простете може би за тъпия въпрос за някой, но как се решава проблема със загубата на точност в следния случай:
Код:
float sum = 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f;

Резултата е 1.0000001

Примерно в Python, този проблем не съществува. :)
« Последна редакция: May 14, 2010, 17:09 от c111100101 »
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Що не пробваш с double?
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Не е баш така, при това на никой език. В частност ето проба с Python:
Код
GeSHi (Bash):
  1. mara@OVNIWatermelon:~$ python
  2. Python 2.5.5 (r255:77872, Apr 21 2010, 08:40:04)
  3. [GCC 4.4.3] on linux2
  4. Type "help", "copyright", "credits" or "license" for more information.
  5. >>> a=0
  6. >>> a
  7. 0
  8. >>> a=0.0
  9. >>> a
  10. 0.0
  11. >>> a=3.0
  12. >>> a
  13. 3.0
  14. >>> a=9.999999999999999999
  15. >>> a
  16. 10.0
  17. >>> a=6.785932526
  18. >>> a
  19. 6.7859325259999999
  20. >>>

Аритметиката с плаваща запетая никога не е точна, независимо на кой език пишеш. Затова винаги, когато проверяваш дали са равни две числа с плаваща запетая, сравнявай дали абсолютната стойност на разликата им е по малка от някакво мъничко число от рода на 1е-6 или по-малко.

ПС. Верно в Java беше малко по-видимо (не знам точно защо), но по принцип това поведение си е универсално.
Активен

c111100101

  • Гост
Що не пробваш с double?
Код:
double suma = 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d;

Резултат: 0.9999999999999999
Активен

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Чисто математически 0.(9) (0 цяло и 9 в период) е 1, освен всичко :)
Активен

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
И само да допълня че доколкото имам спомени точно 0.1 няма точно представяне във формат с плаваща запетая
Активен

0x2B|~0x2B

c111100101

  • Гост
Проблема е, че числата се представят в краен брой битове и от там идва загубата, колкото и малка да е тя. Интересува ме по скоро как тази загуба реално се отразява в практиката?
Възможно ли е да възникнат проблеми вследствие на тази загуба и как се отстраняват?
Или примерно ако сега си стартирам калкулатора на компютъра и събера десет пъти 0.1 получавам точно 1. Как примерно е програмиран калкулатора, че да вади резултат без загуба?
Активен

task_struct

  • Напреднали
  • *****
  • Публикации: 576
  • Distribution: Kubuntu 14.04
  • Window Manager: KDE 4.13
    • Профил
Проблема с точноста при компютърната аритметика е доста срещан, аз лично се боря с него почти всеки ден :(

Реално калкулатора също получава числото с грешка, но използва алгоритъм за отстраняването и.
Всяка сметка се извършва с някаква точност. Всичко след тази точност се отрязва или закръглява (нагоре или надолу)
Активен

"Minds are like parachutes. They only function when they are open." - James Dewar

irc.freenode.net  / #linux-bg

c111100101

  • Гост
Всъщност и в Python го има проблема, ето го и теста:  :)
Код:
>>> a = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1
>>> a
0.99999999999999989
>>> a = 0.99999999999999989
>>> a
0.99999999999999989
>>>
Активен

c111100101

  • Гост
Ето и нещо интересно по темата но за C++ :)
http://www.rbukvar.eu/primer/drobi_tochnost.htm
Активен

laskov

  • Напреднали
  • *****
  • Публикации: 3177
    • Профил
Чисто математически 0.(9) (0 цяло и 9 в период) е 1, освен всичко :)
А след няколко бири даже става 2 :)  [_]3
Активен

Не си мислете, че понеже Вие мислите правилно, всички мислят като Вас! Затова, когато има избори, идете и гласувайте, за да не сте изненадани после от резултата, и за да не твърди всяка партия, че тя е спечелила, а Б.Б. (С.С., ...) е загубил, а трети да управлява.  Наздраве!  [_]3

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Чисто математически 0.(9) (0 цяло и 9 в период) е 1, освен всичко :)
А след няколко бири даже става 2 :)  [_]3
laskov, ти нали не четеш "Хумор, сатира и забава", защо пишеш като за там?
Марче, 0.9(9) си е 0.9(9), НИКОГА не е 1, ноооо, клони към едно. Което е нещо по-различно :P
Активен

0x2B|~0x2B

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Не, точно 1 е.
0.(9)=3*0.(3)=3*(1/3)=1
А понятието клони не е за числа, а за редици и функции.
« Последна редакция: May 15, 2010, 12:59 от bop_bop_mara »
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Не, точно 1 е.
0.(9)=3*0.(3)=3*(1/3)=1
Не е вярно!
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Не, точно 1 е.
0.(9)=3*0.(3)=3*(1/3)=1
Не е вярно!

Е щом считаш, че не е вярно, обясни защо :)
Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
За Java програмисти
Общ форум
smitev 1 6102 Последна публикация Sep 15, 2004, 21:49
от JOKe
Стартиране на Java приложение !
Общ форум
Diabolic_Soul 4 7928 Последна публикация Feb 22, 2005, 00:22
от JOKe
Java IDE?
Идеи и мнения
toxigen 9 9239 Последна публикация Apr 06, 2005, 23:00
от Ivozen
Java/C++
Търсене
bronicman 2 4548 Последна публикация Dec 04, 2005, 19:57
от bronicman
C/C++/Java програмист
Търсене
MNachev 0 2486 Последна публикация Feb 15, 2006, 10:00
от MNachev