2012-05-25 3 views
2

Можно создать дубликат:
C++ double precision and rounding offGCC C/C++ двойное поведение

Код:

int main(void) 
{ 
    double a = 12; 
    double b = 0.5; 
    double c = 0.1; 

    std::cout.precision(25); 
    std::cout << a << std::endl; 
    std::cout << b << std::endl; 
    std::cout << c << std::endl; 
    std::cout << a + b << std::endl; 
    std::cout << a + c << std::endl; 

    return 0; 
} 

Выход:

12 
0.5 
0.1000000000000000055511151 
12.5 
12.09999999999999964472863 

Почему GCC представляет 0,1 и 0,5 по-разному? При добавлении они представлены по-разному. Кажется, что 0.5 и целые числа представлены иначе, чем другие поплавки. Или это что-то происходит в библиотеке io? В чем причина такого поведения?

+0

[related] (http://stackoverflow.com/questions/5098558/float-vs-double-precision). – iammilind

+1

У двух пар не бесконечная точность. Значения, которые вы назначаете, не могут быть точно представлены с использованием удвоений. – MatthewD

+0

Я уточнил свой вопрос.Речь идет не о точности. –

ответ

5

Подобно тому, как десятичные числа с конечным числом цифр могут только точно представлять числа, сумма степеней 10, число двоичных с плавающей точкой может только точно представлять числа, сумма степеней 2.

в этом случае 0.1 не может быть представлено в виде конечной суммы по степеням 2, тогда как 0.5 и 12 может (0.5 равно 2 -1 и 12 равно 2 + 2).

В качестве дополнительного примера, 0,75 также может быть точно представлено в двоичной системе с плавающей точкой, так как он может быть выражен как 2 -1 + 2 -2.

+0

Я вижу .......... –

4

0.1 не может быть точно представлен в двоичном формате, поскольку он не является силой 2 и должен быть представлен рядом, которое действительно действительно действительно близко. Именно поэтому ученикам не рекомендуется использовать оператора == при сравнении чисел с плавающей запятой и банковских приложений, которые почти всегда хранят деньги в виде двух целых чисел, суммы в долларах и количества копеек.

+0

Конечно. Но это приводит меня к моему ответу. Является ли 0,5 по-разному? Это был действительно мой вопрос. Иногда кода недостаточно, чтобы выразить свое развлечение. –

+2

@toor: 0.5 имеет точное двоичное представление, но 0.1 нет. –

4

ответ по умолчанию для этих вопросов:

What every computer scientist should know about floating-point arithmetic

в основном, это неточность точки кодирования с плавающей точкой. У вас около 17 значащих цифр, и выполнение арифметических операций уменьшает их.

+0

Я уточнил свой вопрос. Речь идет не о точности. –

+3

[Reader-friendly] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) версия той же статьи. – Lundin

+0

это - см. Мой комментарий выше или прочитать статью. Он сводится к представлению бесконечной серии двоичных цифр с конечным числом. –

0

Глядя на этом примере:

12 
+ 
0.1000000000000000055511151 
= 
12.09999999999999964472863 

После того, как добавление выполняется, полученный в результате двойной (12.0999...) имеет меньшую точность, выделенный в направлении дробного компонента результата чем оригинал 0.1000... значение сделал. Дробная часть должна измениться, чтобы разместить большее целое число.

Смежные вопросы