2011-12-14 2 views
1

Можно создать дубликат:
Dealing with accuracy problems in floating-point numbersC++ хранения поплавок

Код:

float flt = 78983636; // stores 78983632. as seen in debugger 
flt = 79282056;  // stores 79282056. 

Почему он не в состоянии точно сохранить 1-е значение, но в состоянии на 2 значение больше?

+0

"Larger" имеет мало общего с этим. Пожалуйста, см. Ответ, который я дал другому вопросу (речь идет о Java и удваивается, но применяются те же концепции): http://stackoverflow.com/questions/7811112/why-is-long9223372036854665200d-giving-me-9223372036854665216/7811169#7811169 – NPE

+6

[Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – Joe

+1

Или сделать простой пример: предположим, что вы можете только хранить 'n' как целое число и представляет' 10^n'. Теперь вы можете прекрасно хранить 1000, 10.000 и т. Д., Но будет иметь трудное время, даже считая 5. Подобный принцип для поплавков - он просто немного усложняется, так как мы хотим хранить больше, чем всего лишь 2 ^. – Voo

ответ

6

Типичный 32-битный поплавок имеет около 24 бит целочисленной точности. То, что вы можете точно сохранить свое значение, даже если оно больше, просто потому, что оно попадает в сладкое пятно, которое выглядит как целое, а другое - нет.

В частности, номер 79282056 хранится как 1.1813947 * 2 , или 79282056.2526208. Так что это не точно, есть некоторые цифры после десятичной точки, которые вы опустили.

Вы можете использовать this converter для проверки мантиссы, знака и экспонента, используемого для хранения любого числа с плавающей запятой.