Я использую компилятор VC++ 2010. Мой ниже код дает 509:C++: ошибка странного двойного умножения
double volume = 5.1;
int n = static_cast<unsigned int>(volume * 100.0);
Я что-то пропустил?
Thanks
Я использую компилятор VC++ 2010. Мой ниже код дает 509:C++: ошибка странного двойного умножения
double volume = 5.1;
int n = static_cast<unsigned int>(volume * 100.0);
Я что-то пропустил?
Thanks
Типы данных с плавающей точкой не могут представлять все числа. Так как ваш компьютер использует двоичную плавающую точку, только представимые числа имеют вида 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.
5.1 представлено как 5.099999, оно будет 509.9990 при умножении на 100.0. Оно будет 509 после преобразования в int.
да пропустите что-то ... static_cast (..) –
Mario
Это дублированное здесь дублирование. Просмотрите IEEE754 и проблемы с плавающей запятой здесь [SO]. В принципе, 5.1 не может быть точно представлен, и на самом деле он фактически учитывается как «5.099999999' –
ppeterka
Я думаю, что ваш код не компилируется. Я предлагаю использовать 'round' –