Решал одну задачу на UVa Online Judge. Долго не мог найти проблему и проверял алгоритм.
Но все было гораздо проще. Как вы думаете, что должна выводить следующая программа?
#include <iostream> #include <cmath> using namespace std; int main(int argc, char* argv[]) { double f = 1.15; int a = f * 100.0 + 0.1E-9; int b = f * 100.0; cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; }
Я ожидал два числа 115.
Нет, у меня на VS2008 она печатает:
a = 115
b = 114
Вот такие дела.
Update:
Кстати, если попробовать так:
#include <iostream> #include <cmath> using namespace std; int main(int argc, char* argv[]) { double f = 1.15; int a = f * 100.0 + 0.1E-9; int b = f * 100.0; cout << "a = " << a << endl; cout << "b = " << b << endl; double f1 = 0.15; int a1 = f1 * 100.0 + 0.1E-9; int b1 = f1 * 100.0; cout << "a1 = " << a1 << endl; cout << "b1 = " << b1 << endl; return 0; }
то результат будет:
a = 115
b = 114
a1 = 15
b1 = 15
Как я думаю, это из-за того, что числа, у которых целая часть нулевая имеют немного особое внутреннее представление в IEEE.
На ТопКодере есть отличная статья на эту тему (часть 1 и часть 2). Все кратко и по делу.