2013-04-02 3 views
-2

Я использую компилятор VC++ 2010. Мой ниже код дает 509:C++: ошибка странного двойного умножения

double volume = 5.1; 
int n = static_cast<unsigned int>(volume * 100.0); 

Я что-то пропустил?

Thanks

+0

да пропустите что-то ... static_cast (..) – Mario

+0

Это дублированное здесь дублирование. Просмотрите IEEE754 и проблемы с плавающей запятой здесь [SO]. В принципе, 5.1 не может быть точно представлен, и на самом деле он фактически учитывается как «5.099999999 ' – ppeterka

+0

Я думаю, что ваш код не компилируется. Я предлагаю использовать 'round' –

ответ

6

Типы данных с плавающей точкой не могут представлять все числа. Так как ваш компьютер использует двоичную плавающую точку, только представимые числа имеют вида s2 е где s является мантиссой и е является показателем. И достаточно легко заметить, что 5.1 не подходит для этой формы. Это не совсем представимо.

Это page показывает ближайшую точно представляемую двоичную величину двойной точности двойной точности до 5.1. Значение:

5.09999 99999 99999 64472 86321 19949 90706 44378 66210 9375 

Таким образом, самое близкое значение к 5.1 немного меньше 5.1. Умножьте его на 100 и усечь, и у вас есть 509.

Стандартная ссылка, по которой можно узнать больше о теме Давид Голдберг What Every Computer Scientist Should Know About Floating-Point Arithmetic.

0

5.1 представлено как 5.099999, оно будет 509.9990 при умножении на 100.0. Оно будет 509 после преобразования в int.