Имеется следующая программа, написанная на C++:
#include <iostream>
using namespace std;
int main()
{
double d = 0.6;
cout << "d: " << d << endl;
cout << "(int)(d / 0.2): " << ((int)(d / 0.2)) << endl;
cout << "(int)((float)(d / 0.2)): " << (int)((float)(d / 0.2)) << endl;
}
В результате работы программы на экран выводится следующее:
0.6
(int)(d / 0.2): 2
(int)((float)(d / 0.2)): 3
Почему при приведении (int)( d/0.2 ) получается 2, а при приведении (int)((float)(d / 0.2)) - 3 ?
Приведение double к int
Модератор: Модераторы разделов
-
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: Приведение double к int
Код: Выделить всё
Macintosh:~ KiWi$ cat test.c
#include <stdio.h>
int main() {
double a = 0.6;
double b = 0.2;
printf("%le\n", (a/b - 3.0));
return 0;
}
Macintosh:~ KiWi$ gcc test.c
Macintosh:~ KiWi$ ./a.out
-4.440892e-16
А так хочется получить 0, да?
-
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Приведение double к int
Код: Выделить всё
#include <stdio.h>
int main(void)
{
double xd = 0.6;
xd /= 0.2;
float xf = xd;
double xd_delta = xd - 3;
double xf_delta = xf - 3;
printf("(double) (0.6 / 0.3) = 3 + (%le)\n", xd_delta);
printf("(float) (0.6 / 0.3) = 3 + (%le)\n", xf_delta);
return 0;
}
(double) (0.6 / 0.3) = 3 + (-4.440892e-16)
(float) (0.6 / 0.3) = 3 + (0.000000e+00)
В первом случае результат на очень малую величину меньше 3, но этого хватает, чтобы округлять его до 2. Во втором случае результат получился равным в точности 3.
-
- Сообщения: 585
- Статус: Программист С++
- ОС: Debian GNU/Linux
Re: Приведение double к int
Кстати, а почему в программе, написанной на С++, используется приведение типов в стиле С? static_cast не подходит, что ли?
-
- Сообщения: 53
Re: Приведение double к int
Я знаю, как представляются вещественные числа, и особенности работы с ними. Просто смутило то, что
doule d = 0.6;
cout << d / 0.2 << endl;
выводит 3, а не 2.999..978. Прошу прощения, в первом посте я это не указал. Программа писана не мною, и меня заинтересовал именно пример с приведенными в первом посте значениями. Выходит, вопрос нужно ставить по-другому?
Как заставить cout << d / 0.2 << endl; выводить реальное значение результата?
-
- Сообщения: 229
- ОС: Debian
Re: Приведение double к int
Код: Выделить всё
#include <iostream>
#include <iomanip>
int main()
{
std::cout << std::setprecision(100) << 0.6 / 0.2 << std::endl;
}
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата