Перейти к содержимому

Как получить дробную часть числа в c

  • автор:

Как получить дробную часть числа в c

Для выполнения различных математических операций в библиотеке классов .NET предназначен класс Math . Он является статическим, поэтому все его методы также являются статическими.

Рассмотрим основные методы класса Math:

Abs(double value) : возвращает абсолютное значение для аргумента value

Acos(double value) : возвращает арккосинус value. Параметр value должен иметь значение от -1 до 1

Asin(double value) : возвращает арксинус value. Параметр value должен иметь значение от -1 до 1

Atan(double value) : возвращает арктангенс value

BigMul(int x, int y) : возвращает произведение x * y в виде объекта long

Ceiling(double value) : возвращает наименьшее целое число с плавающей точкой, которое не меньше value

Cos(double d) : возвращает косинус угла d

Cosh(double d) : возвращает гиперболический косинус угла d

DivRem(int a, int b, out int result) : возвращает результат от деления a/b, а остаток помещается в параметр result

Exp(double d) : возвращает основание натурального логарифма, возведенное в степень d

Floor(decimal d) : возвращает наибольшее целое число, которое не больше d

IEEERemainder(double a, double b) : возвращает остаток от деления a на b

Log(double d) : возвращает натуральный логарифм числа d

Log(double a, double newBase) : возвращает логарифм числа a по основанию newBase

Log10(double d) : возвращает десятичный логарифм числа d

Max(double a, double b) : возвращает максимальное число из a и b

Min(double a, double b) : возвращает минимальное число из a и b

Pow(double a, double b) : возвращает число a, возведенное в степень b

Round(double d) : возвращает число d, округленное до ближайшего целого числа

Round(double a, int b) : возвращает число a, округленное до определенного количества знаков после запятой, представленного параметром b

Sign(double value) : возвращает число 1, если число value положительное, и -1, если значение value отрицательное. Если value равно 0, то возвращает 0

Sin(double value) : возвращает синус угла value

Sinh(double value) : возвращает гиперболический синус угла value

Sqrt(double value) : возвращает квадратный корень числа value

Tan(double value) : возвращает тангенс угла value

Tanh(double value) : возвращает гиперболический тангенс угла value

Truncate(double value) : отбрасывает дробную часть числа value, возвращаяя лишь целое значение

Выделение дробной части из числа

Задача на выделение дробной части
Доброго времени суток. Буду краток. Есть задача: Даны три вещественных числа. Найти максимальное и.

Определить равна ли сумма k цифр дробной части заданного вещественного числа сумме цифр целой части
Помогите доделать задание, исправьте пожалуйста код. Срочно! Задание: Выполнить задания, выделяя.

Определения, равна сумма цифр целой части вещественного числа сумме такого же количества цифр в дробной части
Нада написать 2 программки 1. Определения, равна сумма цифр целой части вещественного числа.

Лучший ответСообщение было отмечено как решение

Решение

Сообщение от Mayonez

можешь все это записать в коде?
у меня какая- то ошибка типа этой "error C2100: illegal indirection"
и мне желательно не float , a double

и как указатель на число поставить?))

Сообщение от I_like_C++

Дано число, например, х=124,556
нужно найти его целую и дробную части, чтобы получилось так:
int a(целая),b(дробная)
а=124
b=556

С целой частью проблем нет, а вот как получить дробную часть я не знаю
Помогите, пожалуйста

Сообщение от fasked

Сообщение от easybudda

Извините если не в кассу :

Сообщение от NikolaWhite

Да, класс тут очень в тему *ирония*

Почему не шаблонный? Где реализация паттерна MVC? Непорядок же.

Сообщение от NikolaWhite

Сообщение от Mayonez

тогда записать все число в масив
пока не встретится запятая считать в первый масив(целая часть)
потом считать во второй масив (дробная часть)
потом преобразовать в число

или если фиксированое количество цифр после запятой умножить b на 10 в необходимой степени

Ребят а вот такой вопрос..

Сообщение от gosho

используй стандартную библиотеку <iomanip> — реализует инструменты для работы с форматированием вывода, например базу, используемую при форматировании целых и точных значений чисел с плавающей запятой. википедия

вот примерненький код

Сообщение от LemurDC

Оставлю свое решение.

Вывести старшую цифру дробной части и младшую цифру целой части числа
Искал у вас, не нашел. Я новичок в этом деле, если вам не трудно напишите полностью решение ща.

Отделение дробной части от числа
у меня такое задание: Функци принимает в себя дробное число и возвращает только его дробную часть.

Отделение целой части числа от дробной
деление любое дробное число например: 12.34 и эту цифру надо делить что бы в одном строке было.

Последовательность в дробной части вещественного числа
Верно ли, что первые n цифр дробной части заданного по-ложительного вещественного числа образуют.

Как получить дробную часть числа в c

Здравствуйте, Faust, Вы писали:

F>Пытаюсь выделить дробную часть из числа с плавающей точкой.

А написать формулу

К тому же, можно эти штуки сделать шаблонными, так что они будут работать и с float, и с long double. И даже с каким-нибудь YourCoolFixedPointNum. Главное — чтобы были определены функции floor и ceil, и сравнение с 0.

От: Faust
Дата: 26.12.03 11:50
Оценка:

Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Faust, Вы писали:

F>>Пытаюсь выделить дробную часть из числа с плавающей точкой.

К>А написать формулу
К>
К>не катит?

К>К тому же, можно эти штуки сделать шаблонными, так что они будут работать и с float, и с long double. И даже с каким-нибудь YourCoolFixedPointNum. Главное — чтобы были определены функции floor и ceil, и сравнение с 0.

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

От: Denwer
Дата: 26.12.03 11:55
Оценка:

Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Faust, Вы писали:

Ну мне кажется что надо было получить челу немного другой результат, т.е. не дробную часть в виде float числа, а именно приведенную к wekjve числу, т.е.

Что то вроде этого.

ЗЫ: А получить дробную то это совсем пустяк.

От: Faust
Дата: 26.12.03 12:00
Оценка:

Здравствуйте, Denwer, Вы писали:

D>Ну мне кажется что надо было получить челу немного другой результат, т.е. не дробную часть в виде float числа, а именно приведенную к wekjve числу, т.е.
D>

D>Что то вроде этого.

D>ЗЫ: А получить дробную то это совсем пустяк.

Может у тебя есть формула, которая соответсвует данному стандарту(IEEE(LitleEndian)), и позволяет решить эту задачу? Мне найти ее не удалось, да и собственные потуги не увенчались успехом.

От: Кодт
Дата: 26.12.03 12:01
Оценка: 12 (1)

Здравствуйте, Faust, Вы писали:

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

А. Тогда, в принципе, все просто.

Вот, насколько я понимаю механику.
(Могу заблуждаться. )

От: Faust
Дата: 26.12.03 12:24
Оценка:

Здравствуйте, Кодт, Вы писали:

К>А. Тогда, в принципе, все просто.
К>
К>Вот, насколько я понимаю механику.
К>(Могу заблуждаться. )

Нет, ты не понял. Мне не нужно просто отбросить целую часть у числа. Нужно получить дробную часть числа в переменной типа unsigned long, не изменяя при этом само число.
Да, кстати не 128, а 127 нужно вычитать.

От: Кодт
Дата: 26.12.03 12:57
Оценка:

Здравствуйте, Faust, Вы писали:

F>Нет, ты не понял. Мне не нужно просто отбросить целую часть у числа. Нужно получить дробную часть числа в переменной типа unsigned long, не изменяя при этом само число.

У какого-какого числа?

Очень даже понял. Вот смотри:

F>Да, кстати не 128, а 127 нужно вычитать.

От: Faust
Дата: 26.12.03 13:09
Оценка:

Ты результат этих преобразований видел?
Если нет, то очень советую посмотреть.

От: Аноним
Дата: 26.12.03 13:09
Оценка:

Здравствуйте, Кодт, Вы писали:

F>>Нет, ты не понял. Мне не нужно просто отбросить целую часть у числа. Нужно получить дробную часть числа в переменной типа unsigned long, не изменяя при этом само число.

К>У какого-какого числа?

К>Очень даже понял.

А вот я ничего не понял. Что такое «дробная часть числа» понять могу, а вот как ее представить типом unsigned long — не могу. Если Вы поняли, может, объясните?

От: Faust
Дата: 26.12.03 13:18
Оценка:

Здравствуйте, Аноним, Вы писали:

А>А вот я ничего не понял. Что такое «дробная часть числа» понять могу, а вот как ее представить типом unsigned long — не могу. Если Вы поняли, может, объясните?

От: Кодт
Дата: 26.12.03 13:28
Оценка:

Здравствуйте, Faust, Вы писали:

F>Ты результат этих преобразований видел?
F>Если нет, то очень советую посмотреть.

Видел. это побитовое представление 4байтного числа с плавающей точкой.
Точно так же, как *reinterpret_cast<unsigned long*>((const char*)»\xDE\xAD\xBE\xEF») == 0xDEADBEEF либо 0xFEBEADDE, в зависимости от little|big endian.

От: Аноним
Дата: 26.12.03 13:28
Оценка:

Здравствуйте, Faust, Вы писали:

А>>А вот я ничего не понял. Что такое «дробная часть числа» понять могу, а вот как ее представить типом unsigned long — не могу. Если Вы поняли, может, объясните?

Вы знаете заранее, до какого знака после запятой Вам нужно получить дробную часть?
Или просто не понимаете представления чисел с плавающей точкой?

От: Кодт
Дата: 26.12.03 13:29
Оценка:
От: SchweinDeBurg http://zarezky.spb.ru/
Дата: 26.12.03 13:31
Оценка:

Здравствуйте, Faust, Вы писали:

F>[/ccode]Как мне получить дробную часть?

А чем плоха modf() ?

Splits a floating-point value into fractional and integer parts.

ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia

От: Faust
Дата: 26.12.03 13:35
Оценка:

Здравствуйте, Кодт, Вы писали:

К>Видел. это побитовое представление 4байтного числа с плавающей точкой.
К>Точно так же, как *reinterpret_cast<unsigned long*>((const char*)»\xDE\xAD\xBE\xEF») == 0xDEADBEEF либо 0xFEBEADDE, в зависимости от little|big endian.

а если сделаем так:
, то получим мантиссу этого числа, а именно 724944

От: Faust
Дата: 26.12.03 13:39
Оценка:

Здравствуйте, Кодт, Вы писали:

К>Ах, ты этого хочешь. А скажи ка, любезнейший, какой будет dwFrac для числа 123.0000054321 ?
К>

если число представлено типом float, то dwFrac будет равен 0

От: Faust
Дата: 26.12.03 13:40
Оценка:
От: Кодт
Дата: 26.12.03 14:00
Оценка:

Здравствуйте, Faust, Вы писали:

F>Здравствуйте, Кодт, Вы писали:

К>>Ах, ты этого хочешь. А скажи ка, любезнейший, какой будет dwFrac для числа 123.0000054321 ?
К>>

F>если число представлено типом float, то dwFrac будет равен 0

Ну хорошо, 1.00321.
Чем отличается от 1.321.
И чем отличается от 1.32100.

Или тебе нужно получить представление x = y + z, где y — целое, z = 0.00001 * t, t целое в диапазоне 0..99999 ?

Выбери что-то одно: или трахаться с двоичным представлением вещественных чисел, или писать формулы.
Формула будет простая:

От: Кодт
Дата: 26.12.03 14:09
Оценка:

Здравствуйте, Faust, Вы писали:

Числа с плавающей точкой представлены в виде S * M * 2^E.
Обрати внимание: экспонируется степень 2, а не 10.
Поэтому нахаляву получить десятичную запись дробной части (да и числа целиком) не получится.

От: SchweinDeBurg http://zarezky.spb.ru/
Дата: 26.12.03 14:14
Оценка:

SDB>Splits a floating-point value into fractional and integer parts.

ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia

От: Faust
Дата: 26.12.03 14:31
Оценка:
От: Faust
Дата: 26.12.03 14:34
Оценка:

SDB>>Splits a floating-point value into fractional and integer parts.

SDB>Потом можно форматнуть полученную дробную часть с %f, разобрать полученную строку, отбросив «0.» вначале — и преобразовать получившееся в целое через atoi().

Если бы у меня было процессорное время, я бы так и сделал.

От: Кодт
Дата: 26.12.03 14:42
Оценка:

Здравствуйте, Faust, Вы писали:

F>дабы ускорить вычисления, я решил потрахаться с двоичным представлением, в надежде на то, что из него смогу достать нужные мне цифры.

F> dwWhole = uFloatNumber.IEEE.Mantissa >> (22 — (uFloatNumber.IEEE.Exponent — 127));
F> uFloatNumber.fNumber -= dwWhole;

Те же зайцы, только профи.
Первая строчка — это ничем не лучше (int)fNumber.
Позволь сопроцессору делать свою работу

Как получить дробную часть числа в c

Для выполнения различных математических операций в библиотеке классов .NET предназначен класс Math . Он является статическим, поэтому все его методы также являются статическими.

Рассмотрим основные методы класса Math:

Abs(double value) : возвращает абсолютное значение для аргумента value

Acos(double value) : возвращает арккосинус value. Параметр value должен иметь значение от -1 до 1

Asin(double value) : возвращает арксинус value. Параметр value должен иметь значение от -1 до 1

Atan(double value) : возвращает арктангенс value

BigMul(int x, int y) : возвращает произведение x * y в виде объекта long

Ceiling(double value) : возвращает наименьшее целое число с плавающей точкой, которое не меньше value

Cos(double d) : возвращает косинус угла d

Cosh(double d) : возвращает гиперболический косинус угла d

DivRem(int a, int b, out int result) : возвращает результат от деления a/b, а остаток помещается в параметр result

Exp(double d) : возвращает основание натурального логарифма, возведенное в степень d

Floor(decimal d) : возвращает наибольшее целое число, которое не больше d

IEEERemainder(double a, double b) : возвращает остаток от деления a на b

Log(double d) : возвращает натуральный логарифм числа d

Log(double a, double newBase) : возвращает логарифм числа a по основанию newBase

Log10(double d) : возвращает десятичный логарифм числа d

Max(double a, double b) : возвращает максимальное число из a и b

Min(double a, double b) : возвращает минимальное число из a и b

Pow(double a, double b) : возвращает число a, возведенное в степень b

Round(double d) : возвращает число d, округленное до ближайшего целого числа

Round(double a, int b) : возвращает число a, округленное до определенного количества знаков после запятой, представленного параметром b

Sign(double value) : возвращает число 1, если число value положительное, и -1, если значение value отрицательное. Если value равно 0, то возвращает 0

Sin(double value) : возвращает синус угла value

Sinh(double value) : возвращает гиперболический синус угла value

Sqrt(double value) : возвращает квадратный корень числа value

Tan(double value) : возвращает тангенс угла value

Tanh(double value) : возвращает гиперболический тангенс угла value

Truncate(double value) : отбрасывает дробную часть числа value, возвращаяя лишь целое значение

Как получить точную дробную часть числа с плавающей запятой в виде целого числа?

Я пытался извлечь точную дробную часть из числа с плавающей запятой. Я пробовал с этим:

Но вывод: 0.729996 . По этой причине, когда я делал это:

Это дает мне 72 в качестве вывода. Но я хочу извлечь ровно 73 из заданного числа 254.73 . Я уже знаю, как использовать %.2f во время функции printf() для печати до двух десятичных чисел. Но в моем коде я не хочу печатать номер прямо сейчас. У меня есть некоторые вычисления с этой дробной частью в виде целого числа, т.е. 73 .

Итак, моя проблема в том, как я могу извлечь дробную часть из 254.73 , чтобы я мог получить точное 73 как целое число для выполнения дополнительных вычислений?

Ответы (4)

Проще всего использовать стандартную библиотечную функцию ceil из <math.h> .
Число float 254.73 можно преобразовать в 254.7299957275390625000000 .
f-integer даст 0.7299957275390625000000 .
Теперь умножьте его на 100 и используйте функцию ceil , чтобы получить наименьшее значение. целочисленное значение не менее 72.99957275390625000000 .

ОБНОВЛЕНИЕ: Как указано в комментарий от @Sneftel, указанный выше предложенный метод в этом ответе не будет работать последовательно.

Простой хак состоит в том, чтобы использовать функцию round из math.h для округления f , а затем извлечь дробную часть

Работа с числами.

Доброго времени суток! Мы уже немножко врубились в переменные и типы данных. О последнем мы теперь поговорим подробнее. В этот раз рассмотрим числа. Почаще просматривайте таблицу типов и их диапазон значений, это важно. Вспомним, что есть числа со знаком, без знака, с плавающей точкой (вида 12.345). Для каждого типа без знака есть тип со знаком, но занимающий ту же память, например sbyte (-128 .. 127) и byte (0 .. 255). За всеми типами обратитесь на MSDN. Давайте все разбирать на примерах, так будет не скучно.

Мы можем складывать (+), вычитать (-), умножать (*) и делить (/) переменные. Рассмотрим интересный случай:

Если вы запустите программу, то обнаружите, что результат деления 5 на 2 равен 2. Почему? Потому что деление целочисленное и дробная часть просто отбрасывается. Дробную часть получим чуть позже. Еще один оператор позволяет получить остаток от деления – %. Если в данной программе заменить / на %, то получим 1.

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

Следующий пример будет странно работать:

Компилятор – штука очень умная, и он понимает, что тип int может означать число бóльшее, чем тип short, а значит varB просто не сможет вместить большое число и данные будут потеряны (поэкспериментируйте, это занимательно). Но что, если мы уверены в правильности преобразования и точно знаем, что все условия будут соблюдены? Мы можем привести один тип к другом ручками, это называется явное преобразование:

В скобках указываем тип, который желаем получить. Вообще, вы можете всегда указывать явное преобразование или знать таблицу с диапазонами. По сути, она расставлена в таком порядке, что верхнее можно неявно привести к нижнему, т.е. byte в short, short в int и так далее. Только будьте осторожны со знаками, отрицательное число в положительное не переводится, данные теряются. Ставьте свои эксперименты. Вот теперь мы можем получить дробное число. Есть одна фишка при делении двух целых: одно из них явно приводим к double (плавающая точка) и радуемся жизни, вот так:

Напишем программу, принимающую на вход 2 числа, а выводящая остаток от деления первого на второе. Мы знаем, как получить строку из консоли, окей. Для перевода строки в число нет операции явного приведения, как это работает с числами, но есть некоторые методы.

std::modf, std::modff, std::modfl

Если ошибок не возникает, возвращает дробную часть x с тем же знаком, что и x . Неотъемлемой частью является значение, на которое указывает iptr .

Сумма возвращенного значения и значения, хранящегося в *iptr , дает x (с учетом округления).

Error handling

Эта функция не подвержена ошибкам, указанным в math_errhandling .

Если реализация поддерживает арифметику с плавающей запятой IEEE (IEC 60559),

  • Если x равно ±0, возвращается ±0, а ±0 сохраняется в *iptr .
  • Если x равно ±∞, возвращается ±0, а ±∞ сохраняется в *iptr .
  • Если x равен NaN, NaN возвращается, и NaN сохраняется в *iptr .
  • Возвращаемое значение является точным, текущий режим округления игнорируется
Notes

Эта функция ведет себя так,как если бы она была реализована следующим образом:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *