Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
#1

Как из числа double 4.056 извлечь число 1000?

12.06.2012, 14:50. Просмотров 727. Ответов 12
Метки нет (Все метки)

То есть число это читается так: 4 целых 56 тысячных, вот мне нужно тысячу извлечь программно. Функции, предлагаемые math.h извлекают либо целую часть 4 либо дробную 0.056

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <windows.h>
#include <stdio.h>
#include <math.h>
using namespace std;
 
int main () {
 
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 double x= 4.056;
 double y;
 double* ipart= new double;
 y= modf (x, ipart);
 
 printf ("y= %f\n", y);
 printf ("*ipart= %f\n", *ipart);
 getchar ();
}
Вот максимум, на что я сподобился. Спасибо, кто откликнется!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2012, 14:50
Ответы с готовыми решениями:

Преобразовать 2 числа int в 1 число float(double) | double int1.int2
Всем привет. Изучая азы C++, столкнулся с такой проблемой. Есть два значения...

Извлечь значения из std::vector<char>, трактуя каждый символ, как разряд числа, сформировать это число
Доброго времени суток. Есть вектор char std::vector &lt; char &gt; VECT; ...

Даны числа от 1 до 1000 и число m; вывести результат деления квадрата сотен кратных 5 на число m
Даны числа от 1 до 1000 и число m вывести результат деления квадрата сотен...

Даны числа от 1 до 1000 и число m. Вывести результат умножение куба нечетных сотен на число m
как записать?

Извлечь 3 бита целого числа A с позиции n и перенести в число B на позицию m
Доброго времени суток.Дана вот такая задача : извлечь 3 бита числа А, начиная с...

12
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
12.06.2012, 16:21 #2
Если учесть особенности представления чисел с плавающей точкой, то надеяться на надёжную работу таких алгоритмов не приходится. Тем не менее, если не погнушаться грязью, можно тупо умножать число на 10 до тех пор, пока дробная часть не станет достаточно малой:
C++
1
2
3
4
5
6
7
int Silly(double x)  // возвращает количество нулей (для 1000 вернёт 3, для целого аргумента 0), работает только для положительных аргументов
{
    int silly = 0;
    const double eps = 1e-6;
    for(; x - floor(x) > eps; x *= 10);
    return silly;
}
1
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
12.06.2012, 16:39  [ТС] #3
Цитата Сообщение от Nick Alte Посмотреть сообщение
можно тупо умножать число на 10
мне в голову такое не пришло, тогда так попробую:
C++
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
#include <windows.h>
#include <stdio.h>
#include <math.h>
using namespace std;
 
int main () {
 
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 double x= 4.056;
 double x_0= x;
 double* ipart= new double;
 
 
 int i= 0;
 while (modf (x_0, ipart)) {
  x_0*= 10;
  i++;
 }
 
 printf ("i= %d\n", i);
 
 getchar ();
}
множу на 10 и просто сравниваю дробную часть с нолём и всё.
0
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
28.06.2012, 20:06  [ТС] #4
Опровергаю тык скыть своё решение. методом научного тыка я выяснил, что дробная часть числа 4.056 совсем необязательно 0.056

То есть сперва она такова: (так выглядит по крайней мере)
C++
1
4.056000
Так, а при у множении на 10 картина получается такой:
C++
1
40.560000
Или (к примеру) такой
C++
1
40.560002
...Второй вариант многовероятен и оттого грустен. Ибо мне уже в самом лучшем случае умножая число на 10 и сравнивая дробную часть с нолём, 1000 никак не получить, а в лучшем случае получить 10000000
0
g-h
67 / 67 / 18
Регистрация: 03.06.2012
Сообщений: 176
28.06.2012, 20:22 #5
Может быть вот так?:
C++
1
2
3
4
5
    double x;
 
    cout << "Введите число: ";
    cin >> x;
    cout << "Тысячная часть равна " << (x - int(x)) * 1000 << endl;
0
g-h
67 / 67 / 18
Регистрация: 03.06.2012
Сообщений: 176
28.06.2012, 20:35 #6
Еще скриншот сделал.
0
Миниатюры
Как из числа double 4.056 извлечь число 1000?  
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
28.06.2012, 20:56  [ТС] #7
У тебя получилось случайно. У меня тоже иногда получался такой результат, а иногда нет.
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,050
28.06.2012, 21:05 #8
Из-за упомянутых уже особенностей представления дробных чисел задача практически нерешаемая. Без округлений тут ничего не выйдет. А с ними результат может и не быть похожим на ожидаемый.
Можно через строковое представление что-то получить, но этот метод тоже ограничен.
C
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
#include <stdio.h>
#include <math.h>
#include <string.h>
 
int main () {
    double x = 4.056;
    int n;
    char *ptr, str[20];
 
    sprintf(str, "%f", x);
    for (ptr = str; *ptr && *ptr != '.'; ++ptr)
        ;
 
    n = strlen(ptr);
    while (n > 0 && ptr[--n] == '0')
        ptr[n] = '\0';
 
    if (*ptr)
        *(ptr++) = '\0';
 
    for (; *ptr && *ptr == '0'; ++ptr)
        ;
 
    if (n > 0)
        printf("%f = %s + %s / %.0f\n", x, str, ptr, pow(10, n));
    else
        printf("%f is integer\n", x);
 
    return 0;
}
http://liveworkspace.org/code/740f4155011c97d9da1b1fc35f047f4f
1
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
29.03.2013, 12:37  [ТС] #9
пожалуй, самый надёжный способ
0
Van111
211 / 190 / 22
Регистрация: 03.08.2011
Сообщений: 2,652
Записей в блоге: 12
29.03.2013, 14:10 #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
using namespace std;
 
int main () 
{
 
 double x = 4.056;
 double y = x  -  int(x)  ;
 for (; y / 1.0 > 0;)
  y = y * 10;
 cout << y;
 
 return 0;
}
вот можно попробовать, правда есть проблема в строчке
C++
1
 double y = x  -  int(x)  ;
цепляется мусор в конец
0
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
29.03.2013, 14:18  [ТС] #11
Так в том и дело, а цепляется потому, что 0.056 находится в памяти в шестнадцатеричном виде, и в шестнадцатиричном виде оно там с хвостом. Ну то есть 0.75 будет без хвоста, а 0.056 с хвостом. И никуда от этого хвоста не деться. Способ grizlik78, лучший поэтому.
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
29.03.2013, 14:38 #12
kravam, а в связи с чем возникла задача извлекать тысячные из double? Может имеет смысл изначально работать с типами (создать свой класс например), которые не допустят появления "хвоста"?
0
kravam
быдлокодер
1707 / 894 / 105
Регистрация: 04.06.2008
Сообщений: 5,527
29.03.2013, 14:41  [ТС] #13
Я забыл уже, это давно было.
0
29.03.2013, 14:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2013, 14:41

Разбить число типа double на 2 числа
Добрый день! Попалась мне такая задача - есть 2 интовые переменные, есть число...

Как из 4-х байт, составляющих число типа double, получить это число?
Как из 4-х байт, составляющих число типа double, получить это число? Пример:...

Программа, которая для заданного натурального числа вычисляет 1000-ное число Фибоначи
Помогите написать программу, которая для заданного натурального числа вычисляет...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru