Може ли двойно да представлява всички стойности, които може да представлява float?

Има определени int стойности, които float не могат да бъдат представени.

Въпреки това, може ли двойното да представлява всички стойности, които плаващото число може да представлява?

Интуицията ми казва да, тъй като двойното има повече дробни битове и повече експонентни битове, но може да има някои глупави грешки, които пропускам.


person anon    schedule 08.05.2010    source източник
comment
Кои са някои от int стойностите, до които float не може да стигне? Никога преди не съм го чувал.   -  person Platinum Azure    schedule 09.05.2010
comment
Тъй като float става по-голям, интервалът между представимите стойности нараства. Не можете наистина да представите 10000000001 като плаваща стойност, въпреки че плаваща стойност може да съдържа много по-големи стойности.   -  person cHao    schedule 09.05.2010
comment
За да добавим към казаното от cHao, IEEE float може да носи само до 23/24 бита, тъй като определени битове са запазени за знака и степента.   -  person Armstrongest    schedule 09.05.2010
comment
Първото изречение не е вярно за платформи, които имат 16-битови int   -  person phuclv    schedule 19.12.2013


Отговори (6)


да

Вероятно би било полезно да разберете как работят плувките и двойките.

Без да навлизам много в подробности...

Вземете числото 152853.5047 (периодът на въртене на луната на Юпитер Йо в секунди)

В научна нотация това число е 0.1528535047 × 10^6

Тъй като компютрите разбират само 1 и 0, има начин да се дефинира .

Мантисата (1528535047) и експонентата (6) се съхраняват в рамките на 32 бита... ако си спомням правилно, само 24 бита са за мантисата, така че плаващата запетая обикновено е по-скоро свързана с точността, отколкото с размера. Колкото по-голямо е числото, толкова по-неточно може да бъде.

1528535047 = 1011011000110111001100000000111 така че можете да съхранявате само първите 24 бита... последните три 1 са отрязани.

Тъй като целите числа са 32-битови, вие сте прав, плаваща запетая не може да го съдържа точно. по-малко значимите цифри се отрязват в края.

Всяко цяло число с абсолютна стойност по-малка от 2^24 (24 бита) може да бъде съхранено без загуба на точност. (16 777 216)

Ето как битовете се съхраняват в число с плаваща запетая:

http://phimuemue.wordpress.com/files/2009/06/576px-ieee-754-single-svg1.png

източник Един бит за знака, 8 бита за експонента и 23 бита за мантисата. Следователно, за да отговоря на въпроса ви, тъй като само 23 бита са запазени за мантисата, 32-битово цяло число не може да бъде показано с точност. Той бързо ще започне да отрязва числа (отдясно), тъй като има повече цифри, необходими за показване.

За двойно, вие просто увеличавате броя на битовете, които може да съхранява... всъщност това се нарича двойна точност, така че всяко число, което може да бъде показано като плаващо число, може да бъде показано като двойна. Допълнителните 0 просто се добавят към мантисата.

Поради тази причина, тъй като двойното заема 64 бита, повечето хора ще използват двойно, когато конвертират от 32-битово int в двойно. Плавка би била добра за преобразуване на 16-битов short.

person Armstrongest    schedule 08.05.2010
comment
Въпросът е само за способността да се представят всички плувки като двойни. Това е много дълъг начин да се каже „да“. - person Pascal Cuoq; 09.05.2010
comment
Твърде много информация. Но ако възнамерявате да дадете толкова много информация, вие подвеждате, като не обяснявате също, че най-значимият 1 бит в значимото е имплицитно, с изключение на нула (която е специална) и за денормализирани числа. И накрая, вече не ни е позволено да го наричаме мантиса; трябва да кажем значимо. - person Norman Ramsey; 09.05.2010
comment
Но е доста интересно и подробно. Можете да кажете „да“ в началото и да уточните по-късно. - person Viet; 09.05.2010
comment
@Pascal: Прав си. Направих промяната. Малко се увлякох. Просто си спомням откровението, което имах в разбирането, когато ми беше обяснено за първи път, когато правех Comp. Sci. курсове. @Норман. Благодаря за разясненията. - person Armstrongest; 10.05.2010
comment
@crypticcoder Моят отговор беше за една от ревизиите 1-3, в която, въпреки всички достойнства на този отговор, нещо липсваше. stackoverflow.com/posts/2795794/revisions - person Pascal Cuoq; 17.07.2013

6.2.5/10 in n1256:

Има три истински плаващи типа, обозначени като float, double и long double. Наборът от стойности от типа float е подмножество от набора от стойности от типа double; наборът от стойности от типа double е подмножество от набора от стойности от типа long double.

(подчертаването е мое).

Независимо дали реализацията използва IEEE754 или не е без значение, стандартът C99 гарантира това, което искате.

person Steve Jessop    schedule 09.05.2010
comment
Друг интересен цитат е n1256 6.3.1.5/1 Реални плаващи типове: Когато float е повишен до double или long double, или double е повишен до long double, стойността му остава непроменена - person Ciro Santilli 新疆再教育营六四事件ۍ 02.06.2015

Да, double може да представлява всички стойности, които float може.

Ето защо:

И двете числа са представени като знак, експонента и мантиса. Разликата между float и double е, че има повече място за експонентата и мантисата.

За показателя по-широкият диапазон не е проблем. Можете да представите всички байт-стойности с int и същото важи за експонентата. Мантисата е малко по-различна, но ако запълните допълнителните битове на двойната мантиса с нули, ще получите точно същата стойност като float.

Може да е по-лесно за разбиране в десетичен знак: Да кажем, че имате число в десетичен знак като това:

1.99234

Това число има 5 знака след десетичната запетая. Какво бихте направили, ако трябваше да разширите същото число до 10 знака след десетичната запетая? Лесно: Добавете нули:

1.9923400000

Това е абсолютно същото число, само представено с по-голяма точност в мантисата.

person Nils Pipenbrinck    schedule 08.05.2010

Всяко float число може да бъде представено като double. Не съм сигурен за NaN. (Сигурен съм, че можете да представите float NaN като double чрез добавяне на допълнителни нули към значимото, но не съм сигурен дали софтуерът или хардуерът, който реагира на NaN, ще реагира на такъв NaN по абсолютно същия начин.)

person Norman Ramsey    schedule 09.05.2010

На практика да. Съмнявам се обаче, че е задължително по стандарт. Ако се появи платформа с 64-битови ints (AFAIK на настоящите 64-битови платформи int всъщност е 32-битова, но long е 64) и има double, който също е 64-битов, тогава някои int стойности няма да могат да се представят като double стойности .

person doublep    schedule 08.05.2010
comment
Ще помогне да решите дали е посочено в стандарта, ако кажете за кой стандарт говорите. IEEE 754 предполага, че поплавъците с двойна точност съдържат поплавъци с единична точност. C99 силно препоръчва да се поддържа IEEE 754 с float за IEEE 754 с единична точност и двойно за IEEE 754 с двойна точност. - person Pascal Cuoq; 09.05.2010

Прочетете http://docs.sun.com/source/806-3568/ncg_goldberg.html

person Community    schedule 08.05.2010