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

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

Восстановить пароль Регистрация
 
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
12.06.2012, 14:50     Как из числа double 4.056 извлечь число 1000? #1
То есть число это читается так: 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 ();
}
Вот максимум, на что я сподобился. Спасибо, кто откликнется!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 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
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
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
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
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
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
28.06.2012, 20:56  [ТС]     Как из числа double 4.056 извлечь число 1000? #7
У тебя получилось случайно. У меня тоже иногда получался такой результат, а иногда нет.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
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
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
29.03.2013, 12:37  [ТС]     Как из числа double 4.056 извлечь число 1000? #9
пожалуй, самый надёжный способ
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 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
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
29.03.2013, 14:18  [ТС]     Как из числа double 4.056 извлечь число 1000? #11
Так в том и дело, а цепляется потому, что 0.056 находится в памяти в шестнадцатеричном виде, и в шестнадцатиричном виде оно там с хвостом. Ну то есть 0.75 будет без хвоста, а 0.056 с хвостом. И никуда от этого хвоста не деться. Способ grizlik78, лучший поэтому.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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?
Еще ссылки по теме:

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

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

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

Текущее время: 23:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru