Разлика между Float.MIN_VALUE и Float.MIN_NORMAL?

Възможен дубликат:
Разлика между Double.MIN_NORMAL и Double.MIN_VALUE

1) Моля, някой може ли да ми обясни каква е разликата между MIN_NORMAL и MIN_VALUE?

System.out.println(Float.MIN_NORMAL);
System.out.println(Float.MIN_VALUE);

2) Също така, защо все още печата 1.0?

float f = Float.MIN_NORMAL + 1.0f;
System.out.println(f);

double d = Float.MIN_NORMAL + 1.0f;
System.out.println(d);

Изход:

1.17549435E-38
1.4E-45
1.0
1.0

person Ashwin Jayaprakash    schedule 02.05.2011    source източник
comment

Имам този RadioSelect, където искам да добавя "допълнително" съдържание под моя етикет, като описание, нещо като help_text, но има няколко реда за всяка опция. Използвам приспособлението RadioSelect за моите радио бутони. Възможно ли е това или трябва да правя нещо друго тук? Ето моят код за моя radioselect...

class UserDepartments(forms.Form):
    DEPARTMENTS = (
        ('Physician', 'Physician'),
        ('FrontDesk', 'Front Desk'),
        ('Staff', 'Staff Pool'),
        ('MedicalEssentials', 'Medical Essential'),
    )
    department = forms.ChoiceField(widget=forms.RadioSelect, choices=DEPARTMENTS)

Ето формата, който искам да постигна...

oЛекар

Кратко описание #1

Кратко описание #2

Кратко описание #3

o Рецепция

Още едно кратко описание №1

Още едно кратко описание №2

Още едно кратко описание #3

  -  person Ashwin Jayaprakash    schedule 03.05.2011
comment
Още едно добро въведение (трябваше да го прочетете, преди да публикувате) introcs.cs.princeton.edu/91float и това tfinley.net/notes/cps104/floating.html   -  person Ashwin Jayaprakash    schedule 03.05.2011
comment
Някои завършващи бележки - mindprod.com/jgloss/floatingpoint.html   -  person Ashwin Jayaprakash    schedule 03.05.2011
comment
Това е Java, разбирам ли? Това може да е глупав въпрос, но каква е дефиницията на MIN_NORMAL по отношение на C++?   -  person mwpowellhtx    schedule 15.01.2019


Отговори (1)


Отговорът на първия въпрос е в дубликата.

Отговорът на втория въпрос е:

Както Floats, така и Doubles нямат безкрайна точност. Можете удобно да мислите, че имат около 16 цифри точност. Всичко след това и ще имате грешки при закръгляване и отрязване.

Така че на 1.0e0 + 1e-38 ще липсва прецизност, за да направи каквото и да било, освен за край с 1.0e0 поради съкращаване на допълнителната точност.

Наистина, както и останалата част от отговора, това изисква разбиране как числата с плаваща запетая във формат IEEE всъщност се добавят в двоичен код. Основната идея е, че частта без знак и експонента на двоичното число с плаваща запетая се измества в единицата IEEE-754 на процесора (широка 80 бита на Intel, което означава, че винаги има отрязване в края на изчисление), за да представи неговото реално число. В десетичен знак това ще изглежда така:

Digit: 1 234567890123456
Value: 1.0000000000000000000000000000...0000
Value: 0.0000000000000000000000000000...0001

След като добавката бъде обработена, на практика е:

Digit: 1 234567890123456
Value: 1.0000000000000000000000000000...0001

И така, като се има предвид, че стойността се съкращава около 16-цифрения знак (в десетичен знак това са точно 22 двоични цифри в 32-битово плаващо число и 51 двоични цифри в 64-битово двойно, пренебрегвайки много важния факт, че водещото 1 е изместено (по отношение на експонента) и се предполага (ефективно компресиране на 23 двоични цифри в 22 за 32-битови и от 52 до 51 за 64-битови); това е много интересен момент, но трябва да прочетете по-подробни примери, като тук за тези подробности).

Съкратено:

Digit: 1 234567890123456
Value: 1.00000000000000000000

Обърнете внимание, че наистина малката десетична част е съкратена, като по този начин остава 1.

Ето една добра страница, която използвам винаги, когато имам проблеми с мисленето за действителното представяне в паметта: Десетичен към 32-битов формат IEEE-754. В сайта има връзки и за 64-битови, както и в обратна посока.

person pickypg    schedule 02.05.2011