Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Получение целой части числа  (Прочитано 2501 раз)

0 Пользователей и 1 Гость просматривают эту тему.

_Konstantin_

  • Гость
Re: Получение целой части числа
« Ответ #15 : 16 Июня 2015, 04:13:10 »
alsoijw,Конечно помню
_Konstantin_, этим и пользуюсь, а заодно и
(Нажмите, чтобы показать/скрыть)
Более-менее разобрался в чём дело. Неправильно переводит только в случае если K символ после запятой не был изменён при делении. Сам не знаю почему так, поэтому буду рад обьяснениям
Я еще и сюда поглядываю http://ru.cppreference.com/w/
и сюда http://www.boost.org/
да и вообще активно использую справочные материалы. Когда писал на дотнет то справка от мелкомягких у меня с рабочего стола не исчезала...

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Получение целой части числа
« Ответ #16 : 16 Июня 2015, 13:19:26 »
Когда писал на дотнет то справка от мелкомягких у меня с рабочего стола не исчезала...
Линуксоид рекламирует проприетарную справку О_о
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

_Konstantin_

  • Гость
Re: Получение целой части числа
« Ответ #17 : 16 Июня 2015, 14:27:24 »
Когда писал на дотнет то справка от мелкомягких у меня с рабочего стола не исчезала...
Линуксоид рекламирует проприетарную справку О_о
Я не линуксоид, хотя с этой осью знаком напрямую с 2005 года, и уже несколько месяцев пользую ее взамен форточек. И то что я как программист, кроме С++ и других языков, знаю еще и C# не дает ни кому оснований говорить, что я форточник или линуксоид :) Я человеку лишь показал один из способов писать код, т.е. держать под рукой справку нужного языка.

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Получение целой части числа
« Ответ #18 : 16 Июня 2015, 15:53:02 »
unimix, double K нельзя юзать потому что оператор % станет не доступным. ullint не вмещает. Какие ещё предложения?
_Konstantin_, Справочники я и так очень часто юзаю

Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Получение целой части числа
« Ответ #19 : 16 Июня 2015, 17:20:07 »
Если серьёзно подходить, то вычислять или посмотреть исходник cout или printf посмотреть. А так, оптимизируя код:
Код: (cpp) [Выделить]
if (K) {
    long double val = A / B;
    cout << "value: " << setprecision(40) << fixed << val << endl;

    val *= 10;
    for (int i = 0; i < K - 1; i++) {
        val -= floor(val);
        val *= 10;
    }
    unsigned short res = floor(val);

    cout << "result: " << res << endl;
}

Можно почитать про арифметику с плавающей запятой:
http://habrahabr.ru/post/112953/
http://habrahabr.ru/company/xakep/blog/257897/
« Последнее редактирование: 16 Июня 2015, 17:26:02 от unimix »

_Konstantin_

  • Гость
Re: Получение целой части числа
« Ответ #20 : 16 Июня 2015, 18:07:34 »
unimix, double K нельзя юзать потому что оператор % станет не доступным. ullint не вмещает. Какие ещё предложения?
я думаю тут http://ru.cppreference.com/w/ можно найти ответ

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Получение целой части числа
« Ответ #21 : 16 Июня 2015, 18:10:23 »
Всё, спасибо всем, разобрался, тема решена

Пользователь решил продолжить мысль 16 Июня 2015, 18:11:26:
Код: (cpp) [Выделить]
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{     
      long double A, B;
      double K;
      unsigned short res;
      cin >> A >> B >> K;
      A = (A/B);
      cout << setprecision(50) << fixed << A << endl;
      A *= pow(10, K);
      cout << setprecision(50) << fixed << A << endl;
      res = floor(A);
      cout << res << endl;
      res  %= 10;
      cout << res;
}
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Получение целой части числа
« Ответ #22 : 16 Июня 2015, 18:24:52 »
Каков будет результат, когда: A = 1; B = 6; K = 50?

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Получение целой части числа
« Ответ #23 : 16 Июня 2015, 18:56:24 »
unimix,
0

Пользователь решил продолжить мысль 16 Июня 2015, 18:59:49:
хотя должен быть 4....
« Последнее редактирование: 16 Июня 2015, 18:59:49 от Гриб_под_зонтом »
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Получение целой части числа
« Ответ #24 : 16 Июня 2015, 21:04:45 »
Код: (cpp) [Выделить]
A *= pow(10, K);  // 10 в 50 степени - неплохо так
res = floor(A);   // то же, что и: unsigned short res = static_cast<unsigned short>(floor(A))

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Получение целой части числа
« Ответ #25 : 17 Июня 2015, 11:47:32 »
unimix,
Так в чём ошибка?
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Получение целой части числа
« Ответ #26 : 17 Июня 2015, 16:18:09 »
Гриб_под_зонтом, выход за пределы значений переменных.

Оффлайн Гриб_под_зонтом

  • Автор темы
  • Активист
  • *
  • Сообщений: 301
    • Просмотр профиля
Re: Получение целой части числа
« Ответ #27 : 17 Июня 2015, 18:16:00 »
unimix,
Я это и сам понял, как исправить?
Hp 250 G3: 8Gb RAM, Intel Celeron 2.16-2.58GHz with 2 core, Intel HD Graphics.
Ubuntu 18.04 LTS with GNOME 3.

Оффлайн staso

  • Активист
  • *
  • Сообщений: 437
    • Просмотр профиля
Re: Получение целой части числа
« Ответ #28 : 17 Июня 2015, 18:29:53 »
Пока нет гарантированно точного хранения числа в памяти и гарантированно точных вычислений - пользовать преобразование числа в строку и обратно. Теряя в производительности, но сохраняя точность.

_Konstantin_

  • Гость
Re: Получение целой части числа
« Ответ #29 : 17 Июня 2015, 20:08:03 »
Вообще программист должен давать отчет своим действиям. Это как в жизни - пошел в магазин, купил пылесос, а на кассе выяснилось, что не хватает денег на него. Извечный вопрос - что делать :) Извечный ответ - перед покупкой проверять, хватает ли денег. А Вы пытаетесь пойти на грабеж - денег не хватает, но попыток пройти кассу с пылесосом все равно не оставляете :)
Я думаю, что перед тем как писать программу, нужно понимать, какие типы данных в ней использовать, не ужели нужна такая точность как long double? Как правило хватает double, а то и float... Да и с приведением типов из вещественного в целое так же говорит о слабо проработанном алгоритме. Есть книга хорошая Бьерн Страуструпа (основателя С++), называется Язык программирования С++, там как раз говорится о подборе типов данных. Прочитайте, очень полезная книга.

 

Страница сгенерирована за 0.071 секунд. Запросов: 25.