Приведение double к int

Модератор: Модераторы разделов

_petya_
Сообщения: 53

Приведение double к int

Сообщение _petya_ »

Имеется следующая программа, написанная на 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 ?
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: Приведение double к int

Сообщение KiWi »

Код: Выделить всё

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, да?
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Приведение double к int

Сообщение v04bvs »

Код: Выделить всё

#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.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Приведение double к int

Сообщение deninok »

Кстати, а почему в программе, написанной на С++, используется приведение типов в стиле С? static_cast не подходит, что ли?
Спасибо сказали:
_petya_
Сообщения: 53

Re: Приведение double к int

Сообщение _petya_ »

v04bvs писал(а):
03.02.2008 13:49
В первом случае результат на очень малую величину меньше 3, но этого хватает, чтобы округлять его до 2. Во втором случае результат получился равным в точности 3.

Я знаю, как представляются вещественные числа, и особенности работы с ними. Просто смутило то, что
doule d = 0.6;
cout << d / 0.2 << endl;
выводит 3, а не 2.999..978. Прошу прощения, в первом посте я это не указал. Программа писана не мною, и меня заинтересовал именно пример с приведенными в первом посте значениями. Выходит, вопрос нужно ставить по-другому?
Как заставить cout << d / 0.2 << endl; выводить реальное значение результата?
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: Приведение double к int

Сообщение Red User »

_petya_ писал(а):
05.02.2008 20:09
Как заставить cout << d / 0.2 << endl; выводить реальное значение результата?

Код: Выделить всё

#include <iostream>
#include <iomanip>

int main()
{
    std::cout << std::setprecision(100) << 0.6 / 0.2 << std::endl;
}
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали:
_petya_
Сообщения: 53

Re: Приведение double к int

Сообщение _petya_ »

Спасибо.
Спасибо сказали: