Как получить дробную часть числа в 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
Эта функция ведет себя так,как если бы она была реализована следующим образом: