Но все было гораздо проще. Как вы думаете, что должна выводить следующая программа?
#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). Все кратко и по делу.