Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
13 / 10 / 5
Регистрация: 04.01.2013
Сообщений: 205

Приведение типов

12.10.2014, 11:41. Показов 739. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

Данный кусок кода выделяет целую часть. Потом, вычитая из исходного числа целую часть, получаем дробную. Почему тут дробное число а будет равным нулю? t - произвольное число (например, 0.5).

C++ (Qt)
1
2
3
4
double t;
int i = floor(t);
double a;
a = t - (double)floor(t);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2014, 11:41
Ответы с готовыми решениями:

Приведение типов?
Подскажите, пожалуйста что происходит. Не понимаю почему такой код работает. .h class Km { private: static const...

Приведение типов
Добрый вечер! Реализовываю явное и не явное приведение типов. Есть два класса, сепаративных, A и B. Реализацию явного преобразования...

Приведение типов
Делаю программу, которая кроме всего прочего должна отсортировать массив. Использую для этого qsort. Вот что получилось: ...

13
 Аватар для Nevermind_qqq
73 / 59 / 41
Регистрация: 25.06.2014
Сообщений: 360
12.10.2014, 11:46
ненужная строка
C++
1
int i = floor(t);
зачем округлять int даже переведенный в дабл, это все равно будет целое число
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
12.10.2014, 11:51
С чего бы это у Вас получилось ноль?
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream> 
#include <cmath>
int main()
{
    double t=1.4;
    int i = (int)floor(t);
    double a = t - (double)i;
    std::cout<<a<<std::endl;
    system("pause");
    return 0;
}
1
13 / 10 / 5
Регистрация: 04.01.2013
Сообщений: 205
12.10.2014, 11:55  [ТС]
Цитата Сообщение от Nevermind_qqq Посмотреть сообщение
ненужная строка
C++
1
int i = floor(t);
зачем округлять int даже переведенный в дабл, это все равно будет целое число
Знаю, смысла нет. С интом все нормально. А вот дробную часть не могу получить. Вот и пробую все, что на ум придет.

Добавлено через 3 минуты
Цитата Сообщение от zss Посмотреть сообщение
С чего бы это у Вас получилось ноль?
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream> 
#include <cmath>
int main()
{
    double t=1.4;
    int i = (int)floor(t);
    double a = t - (double)i;
    std::cout<<a<<std::endl;
    system("pause");
    return 0;
}
Так у меня тоже ноль выходил. Странно.. А из-за чего могут выплывать ошибки при построении решения в Visual Studio, не знаете?
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
12.10.2014, 12:02
А с моим кодом у Вас правильно выводит?
Если да, то приведите полностью свой код.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
12.10.2014, 12:04
C++
1
2
3
4
5
6
7
8
9
int main()
{
    double e = 1.234;
    int i = e;
    double d = e - i;
    std::cout << "Целая часть: " << i << '\n' << "Дробная часть: " << d << std::endl;
    system("pause");
    return 0;
}
Миниатюры
Приведение типов  
0
13 / 10 / 5
Регистрация: 04.01.2013
Сообщений: 205
12.10.2014, 12:08  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
С чего бы это у Вас получилось ноль?
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream> 
#include <cmath>
int main()
{
    double t=1.4;
    int i = (int)floor(t);
    double a = t - (double)i;
    std::cout<<a<<std::endl;
    system("pause");
    return 0;
}
Оказывается, ошибка была при вызове функции. Пардон.
Еще у меня выполняется это:

C++ (Qt)
1
(a == 0.0)
Это в уловном операторе, в который заходит a, хотя делать этого не должен. Тут тоже нужно преобразовать число в double?
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
12.10.2014, 12:10
Действительные числа надо сравнивать с некоторой точностью:
C++
1
if(fabs(a)<1e-10)
1
13 / 10 / 5
Регистрация: 04.01.2013
Сообщений: 205
12.10.2014, 12:27  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
Действительные числа надо сравнивать с некоторой точностью:
C++
1
if(fabs(a)<1e-10)
А для чего здесь fabs? Она же модуль возвращает, нет?

Добавлено через 12 минут
Цитата Сообщение от zss Посмотреть сообщение
Действительные числа надо сравнивать с некоторой точностью:
C++
1
if(fabs(a)<1e-10)
В общем, вот мой конструктор, разбивающий произвольное вещественное число на числитель, знаменатель и целую часть:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Fraction:: Fraction (double real) // convert real num to a fraction
{
    double a;//fractional part
    int k=0; // counter
    
 
    integer = (int)floor(real); // integer part
    a = real - (double)integer; 
    
 
 
 
    if (fabs(a) < 1e-10) // real = 25 Сюда так же почему-то попадает a=0.3
    {
        numerator = 0;
        denominator = 1;
    }
 
 
    else if((a !=0.0) && (a*10 - floor(a*10))== 0.0) // a=0.3
    {
        
        numerator = a * 10;
        denominator = 10;
    }
 
    
    else
    {
        while(((a*10) - floor(a)) < 1 && ((a*10) - floor(a)) != 0.0) // a=0.34.....
        {
            a *= 10;
            k++;
        }
        numerator = (int)a;
        denominator = pow(10.0,k);
    }   
}
Не совсем понимаю, как тут надо сравнивать.
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
12.10.2014, 12:31
Цитата Сообщение от luigration Посмотреть сообщение
Она же модуль возвращает
Можно и без нее, но тогда придется проверить в интервале (-1e-10,1e-10):
C++
1
if( a<1e-10 && a>-1e-10)
Добавлено через 2 минуты
Цитата Сообщение от luigration Посмотреть сообщение
else if((a !=0.0) &&...
Здесь уже на ноль проверять не надо (вы уже это проверили)
1
13 / 10 / 5
Регистрация: 04.01.2013
Сообщений: 205
12.10.2014, 12:35  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
Можно и без нее, но тогда придется проверить в интервале (-1e-10,1e-10):
C++
1
if( a<1e-10 && a>-1e-10)
Добавлено через 2 минуты

Здесь уже на ноль проверять не надо (вы уже это проверили)
Почему-то условию fabs(a) < 1e-10 удовлетворяет a=0.3. То есть всегда выполняется первый if. И еще как проверить, что a!=0?

Добавлено через 1 минуту
Цитата Сообщение от zss Посмотреть сообщение
Здесь уже на ноль проверять не надо (вы уже это проверили)
Я проверяю на ноль, чтобы сюда не вошел а, удовлетворяющий предыдущему условию, где он равен 0.
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
12.10.2014, 12:35
Поставьте отладчиком останов на 13 строку и посмотрите, чему равно a
0
13 / 10 / 5
Регистрация: 04.01.2013
Сообщений: 205
12.10.2014, 14:12  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
Поставьте отладчиком останов на 13 строку и посмотрите, чему равно a
А.. Он и не войдет в это условие. Вы правы.

Добавлено через 1 час 34 минуты
У меня еще один вопрос.

C++ (Qt)
1
 int num = static_cast<int> (fraction*10) // fraction - double;
Почему-то тут для fraction = 0.2 или 0.5 работает, а для 0.3 получим 2 вместо 3. Не понимаю, в чем дело.
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
12.10.2014, 14:18
Это из-за неточности представления плавающих чисел.
0.2999999999999 и
0.3000000000001
надо считать одним и тем же числом.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.10.2014, 14:18
Помогаю со студенческими работами здесь

Приведение типов.
Столкнулся с задачей считывания данных из символьного массива с дальнейшим отбором из всего этого чисел и перезаписи их в массив типа...

Приведение типов
Доброго времени суток. Пусть имеются две структуры struct Student { string FirstName; string LastName; int year;

Приведение типов
Доброго времени суток. Есть вопрос. Допустим: class Base { ..... } class Derived:public Base{ .... }

Приведение типов
Всем привет) Есть массив int a = {2 ,4 ,5 ,6 ,256} Числа располагаются по байтам в памяти так: 1б 2б 3б 4б 2 0 0 0 4 ...

Приведение типов
Привет всем! Компилятор выдает варнинг если сравниваются signed и unsigned значения.Допустим, код пересмотреть нельзя и изменить типы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru