Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
#1

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

12.06.2012, 14:50. Просмотров 655. Ответов 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 ();
}
Вот максимум, на что я сподобился. Спасибо, кто откликнется!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2012, 14:50     Как из числа double 4.056 извлечь число 1000?
Посмотрите здесь:

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

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

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

Разбить число типа double на 2 числа - C++
Добрый день! Попалась мне такая задача - есть 2 интовые переменные, есть число double. Их нужно сложить таким образом : к 1-му интовому...

Как из 4-х байт, составляющих число типа double, получить это число? - C++
Как из 4-х байт, составляющих число типа double, получить это число? Пример: unsigned char tmp={63,128,0,0}; // значение double=1.0

Работа цикла - считывание 1000 элементов (double) - C++
Народ помогите с циклом, считаю 1000 элементов (double) и на последнем ходе происходит какой-то сбой, при этом 999 считает нормально....

Как извлечь корень из числа? - C++
Как извлечь корень из числа?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
12.06.2012, 16:21     Как из числа double 4.056 извлечь число 1000? #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;
}
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
12.06.2012, 16:39  [ТС]     Как из числа double 4.056 извлечь число 1000? #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 и просто сравниваю дробную часть с нолём и всё.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
28.06.2012, 20:06  [ТС]     Как из числа double 4.056 извлечь число 1000? #4
Опровергаю тык скыть своё решение. методом научного тыка я выяснил, что дробная часть числа 4.056 совсем необязательно 0.056

То есть сперва она такова: (так выглядит по крайней мере)
C++
1
4.056000
Так, а при у множении на 10 картина получается такой:
C++
1
40.560000
Или (к примеру) такой
C++
1
40.560002
...Второй вариант многовероятен и оттого грустен. Ибо мне уже в самом лучшем случае умножая число на 10 и сравнивая дробную часть с нолём, 1000 никак не получить, а в лучшем случае получить 10000000
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
28.06.2012, 20:22     Как из числа double 4.056 извлечь число 1000? #5
Может быть вот так?:
C++
1
2
3
4
5
    double x;
 
    cout << "Введите число: ";
    cin >> x;
    cout << "Тысячная часть равна " << (x - int(x)) * 1000 << endl;
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
28.06.2012, 20:35     Как из числа double 4.056 извлечь число 1000? #6
Еще скриншот сделал.
Миниатюры
Как из числа double 4.056 извлечь число 1000?  
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
28.06.2012, 20:56  [ТС]     Как из числа double 4.056 извлечь число 1000? #7
У тебя получилось случайно. У меня тоже иногда получался такой результат, а иногда нет.
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
28.06.2012, 21:05     Как из числа double 4.056 извлечь число 1000? #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/740f41...1b1fc35f047f4f
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
29.03.2013, 12:37  [ТС]     Как из числа double 4.056 извлечь число 1000? #9
пожалуй, самый надёжный способ
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
29.03.2013, 14:10     Как из числа double 4.056 извлечь число 1000? #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)  ;
цепляется мусор в конец
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
29.03.2013, 14:18  [ТС]     Как из числа double 4.056 извлечь число 1000? #11
Так в том и дело, а цепляется потому, что 0.056 находится в памяти в шестнадцатеричном виде, и в шестнадцатиричном виде оно там с хвостом. Ну то есть 0.75 будет без хвоста, а 0.056 с хвостом. И никуда от этого хвоста не деться. Способ grizlik78, лучший поэтому.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
29.03.2013, 14:38     Как из числа double 4.056 извлечь число 1000? #12
kravam, а в связи с чем возникла задача извлекать тысячные из double? Может имеет смысл изначально работать с типами (создать свой класс например), которые не допустят появления "хвоста"?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2013, 14:41     Как из числа double 4.056 извлечь число 1000?
Еще ссылки по теме:

Как извлечь числа из строки - C++
Предположим что есть такое выражение и оно записано в блокноте (100;200) , Как извлечь из текстового документа 2 числа 100 и 200? понимаю...

Как извлечь квадратный корень числа? - C++
Как в С++ найти корень с чисел 4 , 9 , 16 , 25 и так далее

Как вывести число double - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main() { setlocale(0, &quot;&quot;); double a,b,c; ...

Как извлечь корень из числа без функции с++ ? - C++
Может с циклами как нибудь

Как преобразовать массив char в число double? - C++
Например: char a=0.25 в double b=0.25


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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
29.03.2013, 14:41  [ТС]     Как из числа double 4.056 извлечь число 1000? #13
Я забыл уже, это давно было.
Yandex
Объявления
29.03.2013, 14:41     Как из числа double 4.056 извлечь число 1000?
Ответ Создать тему
Опции темы

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